{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第2章 感知机"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1．感知机是根据输入实例的特征向量$x$对其进行二类分类的线性分类模型：\n",
    "\n",
    "$$\n",
    "f(x)=\\operatorname{sign}(w \\cdot x+b)\n",
    "$$\n",
    "\n",
    "感知机模型对应于输入空间（特征空间）中的分离超平面$w \\cdot x+b=0$。\n",
    "\n",
    "2．感知机学习的策略是极小化损失函数：\n",
    "\n",
    "$$\n",
    "\\min _{w, b} L(w, b)=-\\sum_{x_{i} \\in M} y_{i}\\left(w \\cdot x_{i}+b\\right)\n",
    "$$\n",
    "\n",
    "损失函数对应于误分类点到分离超平面的总距离。\n",
    "\n",
    "3．感知机学习算法是基于随机梯度下降法的对损失函数的最优化算法，有原始形式和对偶形式。算法简单且易于实现。原始形式中，首先任意选取一个超平面，然后用梯度下降法不断极小化目标函数。在这个过程中一次随机选取一个误分类点使其梯度下降。\n",
    " \n",
    "4．当训练数据集线性可分时，感知机学习算法是收敛的。感知机算法在训练数据集上的误分类次数$k$满足不等式：\n",
    "\n",
    "$$\n",
    "k \\leqslant\\left(\\frac{R}{\\gamma}\\right)^{2}\n",
    "$$\n",
    "\n",
    "当训练数据集线性可分时，感知机学习算法存在无穷多个解，其解由于不同的初值或不同的迭代顺序而可能有所不同。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 二分类模型\n",
    "$f(x) = sign(w\\cdot x + b)$\n",
    "\n",
    "$\\operatorname{sign}(x)=\\left\\{\\begin{array}{ll}{+1,} & {x \\geqslant 0} \\\\ {-1,} & {x<0}\\end{array}\\right.$\n",
    "\n",
    "给定训练集：\n",
    "\n",
    "$T=\\left\\{\\left(x_{1}, y_{1}\\right),\\left(x_{2}, y_{2}\\right), \\cdots,\\left(x_{N}, y_{N}\\right)\\right\\}$\n",
    "\n",
    "定义感知机的损失函数 \n",
    "\n",
    "$L(w, b)=-\\sum_{x_{i} \\in M} y_{i}\\left(w \\cdot x_{i}+b\\right)$\n",
    "\n",
    "---\n",
    "#### 算法\n",
    "\n",
    "随即梯度下降法 Stochastic Gradient Descent\n",
    "\n",
    "随机抽取一个误分类点使其梯度下降。\n",
    "\n",
    "$w = w + \\eta y_{i}x_{i}$\n",
    "\n",
    "$b = b + \\eta y_{i}$\n",
    "\n",
    "当实例点被误分类，即位于分离超平面的错误侧，则调整$w$, $b$的值，使分离超平面向该无分类点的一侧移动，直至误分类点被正确分类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "拿出iris数据集中两个分类的数据和[sepal length，sepal width]作为特征"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.datasets import load_iris\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# load data\n",
    "iris = load_iris()\n",
    "df = pd.DataFrame(iris.data, columns=iris.feature_names)\n",
    "df['label'] = iris.target"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2    50\n",
       "1    50\n",
       "0    50\n",
       "Name: label, dtype: int64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.columns = [\n",
    "    'sepal length', 'sepal width', 'petal length', 'petal width', 'label'\n",
    "]\n",
    "df.label.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1d85ebf41c8>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(df[:50]['sepal length'], df[:50]['sepal width'], label='0')\n",
    "plt.scatter(df[50:100]['sepal length'], df[50:100]['sepal width'], label='1')\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.array(df.iloc[:100, [0, 1, -1]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "X, y = data[:,:-1], data[:,-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "y = np.array([1 if i == 1 else -1 for i in y])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Perceptron"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 数据线性可分，二分类数据\n",
    "# 此处为一元一次线性方程\n",
    "class Model:\n",
    "    def __init__(self):\n",
    "        self.w = np.ones(len(data[0]) - 1, dtype=np.float32)\n",
    "        self.b = 0\n",
    "        self.l_rate = 0.1\n",
    "        # self.data = data\n",
    "\n",
    "    def sign(self, x, w, b):\n",
    "        y = np.dot(x, w) + b\n",
    "        return y\n",
    "\n",
    "    # 随机梯度下降法\n",
    "    def fit(self, X_train, y_train):\n",
    "        is_wrong = False\n",
    "        while not is_wrong:\n",
    "            wrong_count = 0\n",
    "            for d in range(len(X_train)):\n",
    "                X = X_train[d]\n",
    "                y = y_train[d]\n",
    "                if y * self.sign(X, self.w, self.b) <= 0:\n",
    "                    self.w = self.w + self.l_rate * np.dot(y, X)\n",
    "                    self.b = self.b + self.l_rate * y\n",
    "                    wrong_count += 1\n",
    "            if wrong_count == 0:\n",
    "                is_wrong = True\n",
    "        return 'Perceptron Model!'\n",
    "\n",
    "    def score(self):\n",
    "        pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'Perceptron Model!'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "perceptron = Model()\n",
    "perceptron.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1d85ed38ac8>"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEICAYAAABS0fM3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3deXhU5fXA8e8hCYSwyiZICGETgSCyiCAqKLghCm1tq9XWpS0VtK6t/VkBK4hLW61bldJa64JaaysgmyKKQlUQUCBhlzXsa1hCIMv5/TGTEmJCbpJ7586dOZ/nmSeZO3funHcG5uTe97zvK6qKMcaY+FXD7wCMMcb4yxKBMcbEOUsExhgT5ywRGGNMnLNEYIwxcc4SgTHGxDnPE4GIJIjIVyIyrYzHBohIjoh8Hb6N8ToeY4wxJ0uMwGvcBawE6pfz+DxVHeL0YE2aNNH09HQ34jLGmLixePHiParatKzHPE0EIpIKXAWMB+5145jp6eksWrTIjUMZY0zcEJFN5T3m9aWhp4H7gaJT7NNXRJaKyEwR6VLWDiIyXEQWicii3bt3exKoMcbEK88SgYgMAXap6uJT7LYEaK2q3YDngMll7aSqE1W1l6r2atq0zDMbY4wxVeTlGUE/4BoR2Qi8BVwiIq+X3EFVD6rq4fDvM4AkEWniYUzGGGNK8ayPQFUfAB6AUHUQ8CtVvbHkPiLSHNipqioivQklpr2Vfa38/Hyys7PJy8urfuAeSk5OJjU1laSkJL9DMcaY/4lE1dBJROQ2AFWdAFwLjBCRAuAocJ1WYTrU7Oxs6tWrR3p6OiLibsAuUVX27t1LdnY2bdq08TscY4z5n4gMKFPVucUloqo6IZwEUNXnVbWLqnZT1T6q+llVjp+Xl0fjxo2jNgkAiAiNGzeO+rMWEx0mTYL0dKhRI/Rz0iS/IzKxLOJnBF6J5iRQLAgxGv9NmgTDh0Nubuj+pk2h+wA33OBfXCZ22RQTxkSZBx88kQSK5eaGthvjBUsELpo1axYdO3akffv2PP74436HYwJq8+bKbTemuuIyEXhx/bWwsJDbb7+dmTNnsmLFCt58801WrFhR/QObuJOWVrntxlRX3CWC4uuvmzaB6onrr9VNBgsXLqR9+/a0bduWmjVrct111zFlyhR3gjZxZfx4SEk5eVtKSmi7MV6Iu0Tg1fXXrVu30qpVq//dT01NZevWrdU7qIlLN9wAEydC69YgEvo5caJ1FBvvxEzVkFNeXX8ta/iDVQmZqrrhBvviN5ETd2cEXl1/TU1NZcuWLf+7n52dzRlnnFG9gxpjTATEXSLw6vrrueeey9q1a9mwYQPHjx/nrbfe4pprrqneQY0xJgLiLhF4df01MTGR559/nssvv5xOnTrxgx/8gC5dypxV2xhjokrc9RGAd9dfBw8ezODBg90/sDHGeCjuzgiMMcaczBKBMcbEOUsExhgT5Q7l5TP2vRXMX7vHk+PHZR+BMcYEgaoyffl2xk1bwa5Dx2hUJ4kLOri/iKOdERjjAls/wLht/e7D/OTvC7njja9oWq8W747sxx2XdPDkteyMwJhqsvUDjJvy8gt54eN1TPhkPbUSa/DwNV24sU9rEmp4N1OBnRG45NZbb6VZs2ZkZGT4HYqJMFs/wLjl49W7uOxPn/LsR+u4smtz5vyqPzedn+5pEoB4TQQbJsHkdHijRujnhuqfx998883MmjWr2scxwWPrB5jq2nbgKLe9tphbXv6SxAThjZ+dxzPXdadZveSIvH78XRraMAkWDofC8J9wuZtC9wHaVP08/qKLLmLjxo3Vj88ETlpa6HJQWduNOZX8wiJe/u8Gnv5wLUWq/Pryjvz8wrbUTIzs3+jxd0aw9METSaBYYW5ouzFVYOsHmKpYuGEfVz07j0dnrOL8do2ZfU9/br+4fcSTAMTjGUFuOefr5W03pgLFHcIPPhi6HJSWFkoC1lFsyrLn8DEem7GKfy/JpmXD2vz1J724tPPpvsYUf4kgJS10Oais7cZUka0fYCpSVKS8+eVmfj9rNbnHCxg5oB13XNKelJr+fw3H36WhbuMhodR5fEJKaLsJNKvlN9Eqc2sO33nxMx58N5NOLeox864Luf+Ks6IiCUA8JoI2N0DviZDSGpDQz94Tq9VRDHD99dfTt29fVq9eTWpqKi+99JI78RpHvFqL2pjqOJiXz++mZnHN8/PZuj+Xp394Dm/+vA/tm9XzO7STSFlLLEazXr166aJFi07atnLlSjp16uRTRJUTpFiDJD297Mqd1q3BirlMpKkqU5duY9y0lew9cowf92nNfZd1pEHtJN9iEpHFqtqrrMei47zEmGqyWn4TLdbtOsyYKZl89s1ezk5twMs3n0vX1AZ+h3VKlghMTLBafuO3o8cLef7jtUz8dD21kxJ4ZFgG1/dO83xUsBtiJhGoKiLR/YYH7TJckIwff/J8P2C1/CZy5qzcyUNTs8jef5Tv9mjJA1d2omm9Wn6H5VhMJILk5GT27t1L48aNozYZqCp79+4lOTkyQ8bjjdXyGz9k78/l4fdWMHvFTjo0q8tbw/vQp21jv8OqtJjoLM7Pzyc7O5u8vDyfonImOTmZ1NRUkpL86zAyxlTf8YIi/jZ/Pc/OWYsg3DWoAz+9oA1JCdFbiOlrZ7GIJACLgK2qOqTUYwI8AwwGcoGbVXVJZV8jKSmJNm3auBGuMYEyaZKdBUXa59/sZfSUTNbtOszlXU5nzNVdaNmwtt9hVUskLg3dBawE6pfx2JVAh/DtPODF8E9jTAVsHYTI2n3oGI/OWMm7X22lVaPa/P3mXlxylr9TQ7jF0/MYEUkFrgL+Vs4uQ4FXNeQLoKGItPAyJmNiha2DEBmFRcqrn2/kkifnMm3ZNn55SXs+uLt/zCQB8P6M4GngfqC8YXQtgS0l7meHt20vuZOIDAeGA6RZPaAxgI2diISlWw4wanImy7fm0K99Y8YOzaBd07p+h+U6zxKBiAwBdqnqYhEZUN5uZWz7Vu+1qk4EJkKos9i1II0JMBs74Z2c3Hz+8MEqJi3YTJO6tXj2+u5cfXaLqK1KrC4vzwj6AdeIyGAgGagvIq+r6o0l9skGWpW4nwps8zAmY2KGjZ1wn6rynyVbeXTGSvbnHufm89O559IzqZ8c25V+niUCVX0AeAAgfEbwq1JJAGAqcIeIvEWokzhHVbdjjKmQjZ1w15qdhxg1OZOFG/bRPa0hr/60N13OiO6pIdwS8QFlInIbgKpOAGYQKh1dR6h89JZIx2NMkNk6CNWXe7yAZ+es42/z1lOnViKPfbcrP+zVihoBmBrCLRFJBKo6F5gb/n1Cie0K3B6JGIyprJEjYeJEKCyEhITQZZgXXvA7KuMWVeWDFTt5eGoW23Ly+EGvVH5zxVk0rhucqSHcEhNTTBjjtpEj4cUXT9wvLDxx35JB8G3em8vv3svio1W76Hh6Pf51fXfOTW/kd1i+iYkpJoxxW2Ji6Mu/tIQEKCiIfDzGHccKCpn4yXqe/3gdiTWEey49k5vOT4/qqSHcYusRGFNJZSWBU2030W/+2j2MmZLJ+j1HGNy1OaOHdKZFg2BPDeEWSwTGlCEhofwzAhMsuw7mMW76St5buo3WjVP4xy3nMqBjM7/DiiqWCIwpw/DhJ/cRlNxugqGgsIjXvtjEkx+s4XhhEXcP6sBt/duRnGTZvDRLBMaUobhD2KqGgmnJ5v2MejeTFdsPctGZTXn4mi60aVLH77CilnUWG2Nixv4jx/n9+6t4c+EWmtdPZszVnbkyo3nMTg1RGafqLI79rnITeIMGgciJ26BBfkfkvUmTID0datQI/Zw0ye+IoltRkfL2oi0MfOoT3l6Uzc8vbMOH9/VncNfYnR/ITXZpyES1QYNgzpyTt82ZE9r+4Yf+xOQ1W2egclZuP8joyZks2rSfnq1P45FhGXRqUdbyJ6Y8dmnIRLVT/TEXsH+6jqWnlz2raOvWsHFjpKOJXoePFfD07DW8/NlG6icn8sDgTlzbIzWupoaoDBtHYEyA2DoDp6aqzMzcwdj3VrDjYB7X927F/ZefxWl1avodWmBZIjAmytg6A+XbuOcID03N4pM1u+ncoj4v3NiDHmmn+R1W4FlnsYlqAwdWbnssGD8+tK5ASfG+zkBefiFPf7iGy57+lMWb9vPQ1Z2Zekc/SwIusTMCE9U+/PDbHcYDB8ZuRzHYOgOlfbJmN2OmZLJpby5XdzuDUVd14vT6yX6HFVOss9gYE5V25OQxdloWM5bvoG2TOowdmsEFHZr4HVZg2TgCE2hu19Q7PZ7V8vsjv7CIv81bz8An5zJn5S7uu/RMZt59oSUBD9mlIRPV3K6pd3o8q+X3x6KN+xg1OZNVOw5xccemPHxNBmmNUyp+oqkWuzRkoprbNfVOj2e1/JG178hxHp+5krcXZXNGg2QeuqYLl3U+3UYFu8jGEZjAcrum3unxrJY/MoqKlH8u2sITs1ZxOK+AX/Rvy52XdKBOLftqiiR7t01Uc7um3unxrJbfe1nbchg1OZOvNh+gd5tGPDIsgzNPr+d3WHHJOotNVHO7pt7p8ayW3zuH8vJ5+L0srn5uPpv35vLk97vxz+F9LAn4yM4ITFRzu6be6fGslt99qsq0ZdsZN20Fuw8f44bz0vj1ZWfRICXJ79DinnUWG2M8t373YcZMyWL+uj10bdmAR4Zl0K1VQ7/Diis2jiAO+VkDb3X6plhefiFPfrCaK56ex9LsA4wd2oXJt/ezJBBl7NJQDPKzBt7q9E2xj1ftYszUTLbsO8p3urfkgcFn0ayeTQ0RjezSUAzyswbe6vTN1gNHGfteFu9n7aRd0zqMG5bB+e1sVLDfbBxBnPGzBt7q9ONXfmERf5+/gac/XIui3H9FR352QVtqJtoV6GhniSAG+VkDb3X68WnB+r2MnpLJmp2HGdTpdB66ujOtGtnUEEFhqToG+VkDb3X68WXP4WPc+/bX/HDiFxw5Vshff9KLv93Uy5JAwNgZQQzyswbe6vTjQ2GR8ubCzfx+1iqO5hcyckA7fnlJB2rXTPA7NFMF1llsjKmU5dk5jJq8nKXZOfRt25hxw7rQvpmNCo52vowjEJFkEVkoIktFJEtEHi5jnwEikiMiX4dvY7yKx0SfkSMhMRFEQj9HjqzefkEYOxFkOUfzeWhKJkP/PJ+tB/J45rpzeOPn51kSiAWq6skNEKBu+PckYAHQp9Q+A4BplTluz5491QTfiBGq8O3biBFV2+/111VTUk7eJyUltN1rfr52JBQVFem7S7K157jZ2ub/pumYycv1QO5xv8MylQQs0nK+VyNyaUhEUoD5wAhVXVBi+wDgV6o6xOmx7NJQbEhMhMLCb29PSICCgsrvF4SxE0G0btchRk/O4vP1e+mW2oBHhnWla2oDv8MyVeDbOAIRSQAWA+2BP5dMAiX0FZGlwDZCSSGrjOMMB4YDpFl9YUwo68u9rO1O9wvC2IkgOXq8kOc+Wstf562ndlICjwzL4PreaSTUsIViYlGFiUBEagHfA9JL7q+qYyt6rqoWAueISEPgXRHJUNXMErssAVqr6mERGQxMBjqUcZyJwEQInRFU9Lom+iUklP+XflX2C8LYiaD4cMVOHpqaxdYDR/lej1QeGHwWTerW8jss4yEnncVTgKFAAXCkxM0xVT0AzAWuKLX9oKoeDv8+A0gSERuLHgeK5xWqaLvT/YIwdiLabdmXy89eWcTPXl1ESs0E/jm8D0/+oJslgXhQXudB8Q3IrGifcp7XFGgY/r02MA8YUmqf5pwoYe0NbC6+X97NOotjx4gRqgkJoc7VhIRvdwBXdr/XX1dt3VpVJPQzkp21fr52dR3LL9TnP1qrHUfN0LNGzdQJc9fp8YJCv8MyLqM6ncUiMhF4TlWXVybBiMjZwCtAAqEzj7dVdayI3BZOQBNE5A5gBKGzjaPAvar62amOa53Fxrjns2/2MHpyJt/sPsIVXZoz5urOnNGwtt9hGQ9UaRyBiCwXkWXABcASEVktIstKbD8lVV2mqt1V9WxVzdBwn4KqTlDVCeHfn1fVLqraTVX7VJQEjHNe1LU7red3+3h+rW/gdnujya5Dedz91lf86K8LyC9UXr75XCb8uCdn7P8PTE6HN2qEfm6IwQER5tvKO1UAWp/qVt7zvL7ZpaGKeVHX7rSe3+3jOW2L2212u73RoqCwSP/x3w2aMWaWdvjtDH3y/VV69HhB6MH1r6u+laI6iRO3t1JC203gUc1LQ6+p6o8r2hYpdmmoYl7UtTut53f7eH6tb+B2e6PB11sOMGrycjK3HuSC9k0YO7QLbZvWPbHD5HTILeNNTGkNwzZGKkzjkeqOI+hS6mAJQE83AjPe8KKu3Wk9v9vH82t9A7fb66ec3Hx+//4q3li4maZ1a/Hc9d0ZcnYLREqNCcgt580qb7uJGeUmAhF5APgtUFtEDhZvBo4Truk30cmLunan9fxuH8+v9Q3cbq8fVJX/LNnKozNWsj/3OLec34Z7Lu1AveSksp+QklbOGUFAB0QYx8rtLFbVx1S1HvAHVa0fvtVT1caq+kAEYzSV5EVdu9N6freP59f6Bm63N9LW7DzED//yBff9aymtG6fw3i8vYMzVnctPAgDdxkNCqTcxISW03cS28joPgB6nupX3PK9v1lnsjBd17U7r+d0+ntO2uN1mt9sbCYfz8vXR6Su03QPTtdvD7+ubCzZpYWGR8wOsf1313daqkyT00zqKYwZV6SwWkY/DvyYDvYClhC4NnQ0sUNULPMxP5bLOYmO+TVV5P2snY9/LYltOHj/s1YrfXHkWjerU9Ds0EyWqNI5AVS9W1YuBTYTOAHqpak+gO7DOm1BNPPFrfECs2bw3l1v/8SW3vb6Y+rWTeOe2vjxx7dnBSwIbJtkYBp84qRo6S0uMKlbVTBE5x8OYTByYNCl0vT03N3R/06YT199LLlfpdL94dKygkL98sp4/f7yOxBrCqKs6cfP56SQmBHAp8g2TYOFwKAx/0LmbQvcB2sT5Bx0BTsYRvElokrnXAQVuJLTgzPXeh/dtdmkoNvg1PiBWzFu7mzFTstiw5whXdW3B6CGdad4g2e+wqs7GMHiuuuMIbiE0H9Bd4fufAi+6FJuJU36NDwi6nQfzGDdtBdOWbSe9cQqv3Nqb/mc29Tus6rMxDL6qMBGoah7wp/DNGFf4NT4gqAoKi3j18008NXsNxwuLuGfQmfyif1uSkwI0sOFUbAyDr0416dzb4Z/Lw5PNnXSLXIgmFvk1PiCIFm/az9XP/5ex01bQs/VpzL7nIu4a1CF2kgDYGAafneqMoPhSkOP1hI1xqrij98EHQ5d50tJCX+6lO4Cd7heL9h85zhOzVvHWl1toXj+ZF2/owRUZzb89NUQsKO4QXvpg6HJQSlooCVhHcUQ46Sy+FZinqmsjE9KpWWexiXVFRco7i7N5bOZKDuYVcGu/dO4adCZ1a3m6xLiJcVUaR1BCOvAXEflGRN4WkV9a+aj73K6Vd3o8P+fct/EB37Zy+0G+/5fPuf/fy2jXtC7T77yAB6/qXP0kEEs1+rHUFqe8bnN5Q45L3wgtN3knoeUkC50+z+1bLE4x4fZc+k6P5+ec+16smRBkh/Lyddx7Wdr2genafewH+vaXmys3NcSpxNI6A7HUFqdcajPVXI9gFNAPqAt8BcwndKlou7spyZlYvDTkdq280+P5Oee+jQ8IUVVmLN/B2GlZ7Dp0jOvObcX9l5/FaW6OCo6lGv1YaotTLrW5uuMIvktoTeHpwCfAFxoqKTUucbtW3unx/Jxz38YHwIY9RxgzJZN5a/fQuUV9XryxJz3STnP/hWKpRj+W2uJUBNpcYR+BqvYABgILgUuB5SIy37UITLk18VWtlXd6vPLm1o/EnPtutzlI8vIL+dPsNVz+9Kd8vfkAv7u6M1Pv6OdNEoDya/GDWKMfS21xKgJtrjARiEgGoWklbgJ+CGQDH7kWgXG9Vt7p8fyccz9exwfMXb2Ly5/+lGfmrOWKLs2Zc19/bu7Xxtv5gWKpRj+W2uJUJNpcXudB8Y3QJaH7gfOBpIr29/oWi53Fqu7Ppe/0eH7Oue/FmgnRatuBXB3x+iJt/ZtpevEfPtb5a3dHNoBYWmcgltrilAtt5hSdxb5+qVflFquJwG1efMkGIblEm+MFhTrxk2+00+iZeuaDM/S5OWs0L7/A77BMVSwYofpGQqhq542E0P3qimBSO1UisBEqMciLqZudHnPkSHixxJSEhYUn7r/wQtVeO6i+3LiP0ZMzWbXjEJec1YyHr+lCq0YpFT/RRJ+FI2FdiX/YWnjifu8q/sOOoqm3KywfjTaxWD7qNi9KM4NQkhot9h4+xuMzV/Gvxdm0bFibh67uzKWdT4/NqSHixZuJoS//0iQBrq/iP+wIl8JWt3zUBIwXpZlBKEn1W1GR8taXW3hi1iqOHCvgtv7tuHNge1Jq2n+zwCsrCZxquxNRVApb7r9QEXmP0EI0ZVLVazyJyFSbF1M3Oz1mQkL5ZwSxLHNrDqMmZ/L1lgOc16YRjwzLoMPp9fwOy7hFEso/I6iqKJp6+1R/qvwxYlEYV40ff/L1fKh+aabTYw4ffnIfQcntsehQXj5PfrCGVz/fSKM6NXnqB934TveWdhko1rQbfnIfQcntVdVt/Ml9BOBbKWy5iUBVP4lkIMY9Xkzd7PSYxR3CEyeGzgwSEkJJINY6ilWV95Zt55FpK9h9+Bg3nteaX13WkQYpSX6HZrxQ3CH8zcTQmYEkhJJAVTuKIaqm3nYy11AH4DGgM/C/RVFVta23oZXNOouN377ZfZgxUzL577q9dG3ZgEeGZdCtVUO/wzLmlKo7DfXLhNYoLgAuBl4FXnPwoskislBElopIlog8XMY+IiLPisi68MpnPRzEEyhOp1oOwpTMTqesjpk2l5r69/i61/jj+6u54ulPWZadw7ihXZh8e7/KJYGFI0MVKG9I6OfCct5Et6cdjvbj+clpW2KpzaWVN8Cg+AYsDv9cXmLbPAfPE6Bu+PckYAHQp9Q+g4GZ4X37AAsqOm6QBpQ5nWo5CFMyO52yOmbaXMbUv7mv1dJfPnaf3vPWV7rrYF7lj7lgxMlTCRffSg9Mcnuq5Wg/np+ctiUG2kw1p6H+L3Ah8A6hOYa2Ao+rakenyUZEUghNXz1CVReU2P4XYK6qvhm+vxoYoKeY4jpIl4ac1t4HYUpmp+MDYqbN5dR459VMJfnaLVU7ptNadLfry6P9eH5y2pYYaHN1Lw3dDaQQWpSmJ/BjQhPQOXnhBBH5GtgFzC6ZBMJaAiX/V2WHt5U+znARWSQii3bv3u3kpaOC09r7IEzJ7HR8QKy0Wcup5U4+vrUaB3VYi+52fXm0H89PTtsSS20ug5NpqL9U1cPAQeBOVf2uqn7h5OCqWqiq5wCpQO/wTKYllVVj961TFFWdqKq9VLVX06ZNnbx0VHA61XIQpmR2OmV1LLT5i/V72VXQrOwHq1PjXV7Neentbk87HO3H85PTtsRSm8vgZBrqXiKyHFhGaC2CpSLSszIvoqoHgLnAFaUeygZalbifCmyrzLGjmdOploMwJbPTKauD3Obdh45x79tfc93EL3gx51YKpfbJO1S3xru8mvPS292edjjaj+cnp22JpTaXpbzOg+IboQRwYYn7FwDLHDyvKdAw/HttYB4wpNQ+V3FyZ/HCio4bpM5iVeczdgZhSmans4oGrc0FhUX66ucbtetDs7T9b6frH2at0txjBd7MDOl0Bku3Xzvaj+cnp20JeJupbmexqvaraFsZzzsbeAVIIHTm8baqjhWR28IJaIKEhl8+T+hMIRe4RVVP2RMcpM5iE/2WZR9g1ORMlmXncH67xowdmkH7ZnX9DssY11W3s3ihiPxFRAaISH8ReQGYKyI9TlX3r6rLVLW7qp6tqhmqOja8fYKqTgj/rqp6u6q2U9WuFSWBWBb1NfUxJudoPqMnZzL0z/9le04ez1x3DpN+dp73SSDaa9a9iC/axzDE8vgAh5xMi3hO+OdDpbafT6hj9xJXI4pDXqwfYMqmqkz+eivjp69k35Hj3NQ3nXsvO5P6yRGYGsLp/PN+zVPvRXxutyXajxdQth5BFIj6mvoYsXbnIUZNzmTBhn10a9WQ8cMyyGjZIHIBRHvNuhfxRfsYhhgYH+BUtdYjEJHTgUeBM1T1ShHpDPRV1ZdcjjNuRXtNfdDlHi/guY/W8ddP11OnViKPfqcr153biho1IjxDaLTXrHsRX7SPYYjx8QFOOekj+AfwPnBG+P4aQoPMjEuiuaY+6D7I2sGlT33Ki3O/YVj3lsy5rz8/Oi8t8kkAor9m3Yv4on0MQ4yPD3DKSSJooqpvA0UAqloAxMF6U5ETjTX1QbdlXy4/e+VLhr+2mLq1Enn7F3354/e70aRuLf+CivaadS/ii/YxDLE+PsAhJ53FR0SkMeERvyLSB8jxNKo448X6AfHqWEEhf5u3gec+WksNEX47+Cxu6deGpAQnf/N4zOn8837NU+9FfG63JdqPF1BOxhH0AJ4DMoBMQgPFrlXVZd6H922x2Fls3PHZuj2MmpLJ+t1HuDKjOaOHdOaMhrUrfqIxcaBancWqukRE+gMdCY0AXq2q+S7HaEyV7TqYx/gZK5ny9TbSGqXw8i3ncnHHcuYKCoqFI91dDctt0R4fhEpD/fhL36/XrQYnVUPfB2apapaIjAJ6iMgjqrrE+/CMKV9hkfLa5xt58oM1HCso4s6BHRg5oB3JSdVYUDwaLBx58vq4WnjifjR82UZ7fBD9YzGijJNLQ8tU9WwRuYDQkpV/BH6rqudFIsDS7NKQAfhq835GTc4ka9tBLuzQhLFDM2jTpI7fYbnD6boFfon2+CD6x2L4oFqXhjhRIXQV8KKqThGR37kVnDGVcSD3OL9/fzVvLtxMs3q1+POPejC4a3NC01bFCKfrFvgl2uOD6B+LEWWcJIKt4ZXEBgFPiEgtnJWdGuMaVeWdxdk8NnMVOUfzubVfG+4e1IF6kZgaItIkofy/uKNBtMcHoWvzZf5lHoGxGH68bjU5+UL/AaEBZVdoaF2BRsCvPY3KmBJW7zjED/7yOb9+Z7Lztg8AABNSSURBVBnpjVN4744LGD2kc2wmAXC+boFfoj0+iP6xGFHGSdVQLvCfEve3A+WuKWyMW44cK+CZOWt5af4G6iUn8sT3uvL9nj5MDRFpxR2u0VqVE+3xQfSPxYgyNumciTqqyqzMHYydtoLtOXlcd24r7r/iLBrVqel3aMYEVnXXIzAmYjbtPcIt//iSEZOW0DClJv8ecT6Pf+9sZ0kgCPPKux3jwpGhKp43JPRz4cjois8EgpPOYmM8l5dfyMRP1/Pnj9eRWEMYPaQzN/VtTaLTqSGCUL/tdoxu1/MH4T00nrBLQ8Z389buZsyULDbsOcKQs1sw6qrONG+QXLmDRHH99v+4HaPb9fxBeA9NlVV3HIExntiRk8e46SuYvmw76Y1TePXW3lx0ZtOqHSwI9dtux+h2PX8Q3kPjCUsEJuIKCov4x2cb+dPsNeQXKfcMOpNf9G9bvakhglC/7XaMbtfzB+E9NJ6wzmITUYs37WPIc/N5ZPpKzm3TiNn3XMRdgzpUf36gINRvux2j2/X8QXgPjSfsjMBExP4jx3l85ir+uWgLLRokM+HGHlzexcWpIYJQv+12jG7X8wfhPTSesM5i46miIuVfi7fw+MxVHMor4KcXtOHOgR2oU8v+BjEmkmwcgfHFim0HuXbCZ/zm38tp36wu0++8kAcGd4rNJOB2/b3T41ndv3FBDP6PNH47fKyAP81ewz8+20iD2kn88fvd+F6PlrE1Q2hJbtffOz2e1f0bl9ilIeMaVWX68u2Mm7aCXYeOcX3vNO6/vCMNU2J8agi36++dHs/q/k0l2DgC47kNe44wZkom89buocsZ9ZlwY0+6p53md1iR4Xb9vdPjWd2/cYklAlMtefmFvDD3GybM/YZaiTV4+Jou3NinNQmxPkNoSW7X3zs9ntX9G5dYZ7Gpso9X7+KyP33Ks3PWcmXX5sy5rz83nZ8eX0kA3K+/d3o8q/s3LrEzAlNp2w4cZdy0FczM3EHbpnV442fncX77Jn6H5R+36++dHs/q/o1LrLPYOJZfWMTL/93A0x+upbBIuXNgB352YRtqJUbREoXGmDL5Mo5ARFqJyMcislJEskTkrjL2GSAiOSLydfg2xqt4TPV8uXEfQ56dz6MzVtG3bWM+vLc/t1/cPjJJIAi18lb3X3323vjGy0tDBcB9qrpEROoBi0VktqquKLXfPFUd4mEcphr2Hj7GYzNX8c7ibFo2rM3EH/fksi7NIxdAEGrlre6/+uy98ZVnZwSqul1Vl4R/PwSsBFp69XrGXUVFyqQFm7jkyU+Y/NVWRgxox+x7L4psEoDQ9e/iL4dihbmh7dHCaYxBaItf7L3xVUQ6i0UkHegOLCjj4b4ishTYBvxKVbPKeP5wYDhAWpqVxnktc2sOD07OZOmWA/Rp24hxQzPocHo9f4IJQq281f1Xn703vvI8EYhIXeDfwN2qerDUw0uA1qp6WEQGA5OBDqWPoaoTgYkQ6iz2OOS4dTAvn6c+WMOrn2+kUZ2a/OmH3Rh2js9TQwShVt7q/qvP3htfeTqOQESSCCWBSar6n9KPq+pBVT0c/n0GkCQicVyH6A9VZcrXWxn45Ce88vlGbuzTmjn3DeA73VP9nx8oCLXyVvdfffbe+MqzMwIJfYO8BKxU1afK2ac5sFNVVUR6E0pMe72KyXzbul2HGTMlk8++2cvZqQ146aZenJ3a0O+wTghCrbzV/VefvTe+8mwcgYhcAMwDlgNF4c2/BdIAVHWCiNwBjCBUYXQUuFdVPzvVcW0cgTuOHi/k+Y/XMvHT9SQnJXD/FWfxo95p8Tcq2Jg44cukc6o6Hzjlt4qqPg8871UMpmxzVu7koalZZO8/yne7t+SBwZ1oWq+Wey+wYVL8/WW3cKR7K4UZE2E2xUQcyd6fy8PvrWD2ip10aFaXN3/eh77tGrv7IvFYD75wJKx78cR9LTxx35KBCQCbYiIOHC8o4qX5G3h2zloA7hrUgVv7taFmoge1AvE4R/6biaEv/9IkAa4viHw8xpTB1iOIY59/s5fRUzJZt+swl3U+nTFXdyb1tJSKn1hV8VgPXlYSONV2Y6KMJYIYtfvQMR6dsZJ3v9pK6mm1eemmXgzsdLr3LxyP9eCSUP4ZgTEBYIkgxhQWKW8s2MTv319NXn4hd1zcntsvbk/tmhH6Uuo2/uQ+Aoj9evB2w0/uIyi53ZgAsEQQQ5ZlH+DBdzNZvjWHfu0bM3ZoBu2a1o1sEPFYD17cIWxVQyagrLM4BuTk5vPHD1bz+oJNNKlbi9FDOnP12S38HxVsjIkavqxHYLwxaRKkp0ONGtC6tXL3+L0MfGoukxZs4qa+6cy5rz/XdDsjGEkgluafj6W2+MXeQ9/YpaEAmTQJhg+H3PDl982bhWd/14DuN6QxdXxzMlo28DfAyoil8Qax1Ba/2HvoKzsjCJAHHzyRBIppQSJ7Pj4zWEkAYmv++Vhqi1/sPfSVJYKAUFU2by67P2fLlgBcBiotlsYbxFJb/GLvoa8sEQTAln25/PSVRdSod7TMxwO5Vk954wqCON4gltriF3sPfWWJIIodKyjk+Y/WMuipT/hi/V5uvvMQKSknnxWkpMD4IJbox9L887HUFr/Ye+gr6yyOUv9dt4fRkzNZv+cIg7s2Z/SQzrRoUJuLzwr1FWzeHDoTGD8ebghiX1osjTeIpbb4xd5DX9k4giiz62Aej0xfydSl20hrlMLDQ7twccdmfodljAk4m3QuAAoKi3jti008+cEajhcUcdfADowY0I7kJJuvxkSQF2tJxOP6FAFjiSAKfLV5P6MmZ5K17SAXdmjC2KEZtGlSx++wTLzxopbfxgcEgiUCHx3IPc4Ts1bz1pebaVavFn/+UQ8Gd20ejFHBJvacqpa/ql/aXhzTuM4SgQ+KipR3lmTz+MxV5BzN56f92nD3pWdSt5Z9HMZHXtTy2/iAQLBvnghbteMgoydn8uXG/fRIa8gjw7rS+Yz6fodljDdrScTj+hQBZOMIIuTwsQLGT1/BVc/OZ+2uwzzxva68c9v5lgRM9PCilt/GBwSCnRF4TFWZlbmDh99bwY6DeVx3bit+c8VZnFanpt+hGXMyL2r5bXxAINg4Ag9t3HOEh6Zm8cma3XRqUZ9HhmXQs/VpfodljIlDNo4gwvLyC5nwyTe8MPcbkmoIo4d05qa+rUlMsCtxxpjoY4nAZZ+u2c2YKZls3JvLkLNbMOqqzjRvkOx3WMYYUy5LBC7ZkZPHuGkrmL58O22a1OG1n/bmwg5N/Q7LGGMqZImgmgoKi/jHZxv50+w1FBQp9116JsP7t6VWok0NYYwJBksE1bBo4z5GTc5k1Y5DDOjYlLHXZJDWOKXiJxpjTBSxRFAF+44c5/GZK3l7UTYtGiQz4caeXN7ldJsawhgTSJYIKqGoSHl70RYen7WKw3kF/OKittw5sAN1bGoIY0yA2TeYQ1nbchg1OZOvNh+gd3ojxg3LoGPzen6HZYwx1eZZIhCRVsCrQHOgCJioqs+U2keAZ4DBQC5ws6ou8SqmqjiUl89Ts9fwymcbOS2lJk9+vxvf7dHSLgO5weapNyYqeHlGUADcp6pLRKQesFhEZqvqihL7XAl0CN/OA14M//SdqjJt2XbGTVvB7sPH+FHvNH59eUcaptjUEK6weeqNiRqeJQJV3Q5sD/9+SERWAi2BkolgKPCqhua5+EJEGopIi/BzfbN+92EemprFvLV7yGhZn4k/6cU5rRr6GVLssXnqjYkaEekjEJF0oDuwoNRDLYEtJe5nh7edlAhEZDgwHCAtzbvpa/PyC3nh43VM+GQ9tRJrMHZoF244rzUJNewykOtsnnpjoobniUBE6gL/Bu5W1YOlHy7jKd+aBU9VJwITITTpnOtBAh+v2sWYqZls2XeUYeecwW+v6kSzejY1hGdsnnpjooaniUBEkgglgUmq+p8ydskGWpW4nwps8zKm0rYdOMrD72XxftZO2jWtwxs/P4/z2zWJZAjxqdv4k/sIwOapN8YnXlYNCfASsFJVnypnt6nAHSLyFqFO4pxI9Q/kFxbx9/kbeGbOWopU+fXlHfn5hW2pmWgzhEaEzVNvTNTw8oygH/BjYLmIfB3e9lsgDUBVJwAzCJWOriNUPnqLh/H8z8IN+xg1eTlrdh5mUKdmPHR1F1o1sqkhIq7NDfbFb0wU8LJqaD5l9wGU3EeB272KobQ9h4/x2IxV/HtJNi0b1uavP+nFpZ1Pj9TLG2NMVIqbkcUfr9rF3f/8mtzjBYwc0I47LmlPSs24ab4xxpQrbr4J2zSpwzmtGjJ6SCfaN7OpIYwxpljcJIL0JnV45dbefodhjDFRx0pkjDEmzlkiMMaYOGeJwBhj4pwlAmOMiXOWCIwxJs5ZIjDGmDhnicAYY+KcJQJjjIlzEpruJzhEZDdQxkT2jjQB9rgYjp+sLdEpVtoSK+0Aa0ux1qratKwHApcIqkNEFqlqL7/jcIO1JTrFSltipR1gbXHCLg0ZY0ycs0RgjDFxLt4SwUS/A3CRtSU6xUpbYqUdYG2pUFz1ERhjjPm2eDsjMMYYU4olAmOMiXMxmwhEJEFEvhKRaWU8JiLyrIisE5FlItLDjxidqqAtA0QkR0S+Dt/G+BGjEyKyUUSWh+NcVMbjgfhcHLQjSJ9JQxF5R0RWichKEelb6vFAfCbgqC2B+FxEpGOJGL8WkYMicnepfVz9XGJ5hbK7gJVA/TIeuxLoEL6dB7wY/hmtTtUWgHmqOiSC8VTHxapa3oCYIH0up2oHBOczeQaYparXikhNIKXU40H6TCpqCwTgc1HV1cA5EPojENgKvFtqN1c/l5g8IxCRVOAq4G/l7DIUeFVDvgAaikiLiAVYCQ7aEksC87nEAhGpD1wEvASgqsdV9UCp3QLxmThsSxANBL5R1dKzKbj6ucRkIgCeBu4Hisp5vCWwpcT97PC2aFRRWwD6ishSEZkpIl0iFFdVKPCBiCwWkeFlPB6Uz6WidkAwPpO2wG7g5fClx7+JSJ1S+wTlM3HSFgjG51LSdcCbZWx39XOJuUQgIkOAXaq6+FS7lbEt6upoHbZlCaE5RLoBzwGTIxJc1fRT1R6ETmtvF5GLSj0eiM+FitsRlM8kEegBvKiq3YEjwP+V2icon4mTtgTlcwEgfHnrGuBfZT1cxrYqfy4xlwiAfsA1IrIReAu4REReL7VPNtCqxP1UYFtkwquUCtuiqgdV9XD49xlAkog0iXikDqjqtvDPXYSuefYutUsgPpeK2hGgzyQbyFbVBeH77xD6Mi29T9R/JjhoS4A+l2JXAktUdWcZj7n6ucRcIlDVB1Q1VVXTCZ1WfaSqN5babSrwk3DPex8gR1W3RzrWijhpi4g0FxEJ/96b0Ge6N+LBVkBE6ohIveLfgcuAzFK7Rf3n4qQdQflMVHUHsEVEOoY3DQRWlNot6j8TcNaWoHwuJVxP2ZeFwOXPJZarhk4iIrcBqOoEYAYwGFgH5AK3+BhapZVqy7XACBEpAI4C12l0Dhc/HXg3/P8wEXhDVWcF8HNx0o6gfCYAvwQmhS9DrAduCeBnUqyitgTmcxGRFOBS4Bcltnn2udgUE8YYE+di7tKQMcaYyrFEYIwxcc4SgTHGxDlLBMYYE+csERhjTJyzRGBMJYVnsSxvJthvbXfh9YaJSOcS9+eKSEwsxm6igyUCY6LfMKBzhXsZU0WWCEzMCY/+nR6eXCxTRH4Y3t5TRD4JTxb3fvFsjeG/sJ8Wkc/C+/cOb+8d3vZV+GfHU71uGTH8XUS+DD9/aHj7zSLyHxGZJSJrReT3JZ7zUxFZE47nryLyvIicT2i+mT9IaG76duHdvy8iC8P7X+jSW2fiVNyMLDZx5Qpgm6peBSAiDUQkidBEY0NVdXc4OYwHbg0/p46qnh+eQO7vQAawCrhIVQtEZBDwKPA9hzE8SGhKkFtFpCGwUEQ+DD92DtAdOAasFpHngEJgNKH5cQ4BHwFLVfUzEZkKTFPVd8LtAUhU1d4iMhh4CBhUlTfKGLBEYGLTcuCPIvIEoS/QeSKSQejLfXb4izQBKDk3y5sAqvqpiNQPf3nXA14RkQ6EZnZMqkQMlxGaMPBX4fvJQFr49zmqmgMgIiuA1kAT4BNV3Rfe/i/gzFMc/z/hn4uB9ErEZcy3WCIwMUdV14hIT0JzsTwmIh8QmiU0S1X7lve0Mu6PAz5W1e+ISDowtxJhCPC98GpTJzaKnEfoTKBYIaH/h2VNK3wqxccofr4xVWZ9BCbmiMgZQK6qvg78kdDlltVAUwmvYysiSXLywiTF/QgXEJrJMQdoQGiZQICbKxnG+8AvS8x22b2C/RcC/UXkNBFJ5ORLUIcInZ0Y4wn7S8LEoq6EOleLgHxghKoeF5FrgWdFpAGhf/tPA1nh5+wXkc8IrQtd3G/we0KXhu4ldM2+MsaFj78snAw2AuWulauqW0XkUWABoXnlVwA54YffAv4qIncSmkHTGFfZ7KMm7onIXOBXqrrI5zjqqurh8BnBu8DfVbX0ouXGuM4uDRkTPX4nIl8TWuhmA1G+lKKJHXZGYIwxcc7OCIwxJs5ZIjDGmDhnicAYY+KcJQJjjIlzlgiMMSbO/T9NUz/yUo7JYQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "x_points = np.linspace(4, 7, 10)\n",
    "y_ = -(perceptron.w[0] * x_points + perceptron.b) / perceptron.w[1]\n",
    "plt.plot(x_points, y_)\n",
    "\n",
    "plt.plot(data[:50, 0], data[:50, 1], 'bo', color='blue', label='0')\n",
    "plt.plot(data[50:100, 0], data[50:100, 1], 'bo', color='orange', label='1')\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### scikit-learn实例"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "import sklearn\n",
    "from sklearn.linear_model import Perceptron"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.23.1'"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sklearn.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Perceptron()"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = Perceptron(fit_intercept=True, \n",
    "                 max_iter=1000, \n",
    "                 shuffle=True)\n",
    "clf.fit(X, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 23.2 -38.7]]\n"
     ]
    }
   ],
   "source": [
    "# Weights assigned to the features.\n",
    "print(clf.coef_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[-5.]\n"
     ]
    }
   ],
   "source": [
    "# 截距 Constants in decision function.\n",
    "print(clf.intercept_)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1d85edc8e08>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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27xujMkGFgMDgT8EuQYREZGosm7dOho0aEBaWhqH6biQCGKtZdu2baxbt462bdtW+/uCeqnRWtvPWtvfWtsf5x5nz/lvclvRk8Dr/se/ttZ+GswaREREok1RURHNmjVT6IoixhiaNWtW417KkA1s94cvgEcqtS/G+WSjiIiI+Cl0RZ+jec00c72IiIhImCh4iYiICADt27ev1nYjRowIaR3z589n/vz5IX0Otyh4iYiIRBmvF9LSICHBWXq94X3+MWPGhHT/sRy8NHmpiIhIFPF6ITMTfD5nvaDAWQfIyAjuc/Xv358zzjiDhQsX8tFHH/2k/fPPPwdg//79XHvttezevZtmzZoxefJkkpJ+Hi+q2u7gwYPcdNNN/PDDD5x66qn87W9/4+GHH+add94B4PXXX2f69OkcOHCAW265hQ0bNtC6dWtee+01SktLf7a/oqIiBg0axL59+2jfvj2vvfZacE9IEKjHS0REJIqMGnUodJXz+Zz2YJs9ezZnnXXWT0JXZUuXLiUhIYEZM2bw61//mr1793LnnXfSv3//H/89+eSTVW6Xk5ND165dmTFjBhs3bmThwoWMHj2akSNHMnLkSKZPnw7A3//+d7p27coXX3xBhw4d+Mc//lHl/jZu3MiwYcP49NNPyc/PZ/PmzcE/KcdIPV4iIiJRpLCwZu3HomvXrlx99dWH3ea0006ja9eu/PKXv6RDhw5cfPHFvPzyyz/bzlr7s+2WL1/OV199xeeff87OnTtZv3493br9fOKDpUuX/lhH7969mTZtGnfeeefP9lerVi1eeeUVXnvtNbZv387+/fuDcyKCSD1eIiIiUSQlpWbtx6J+/fpH3GbBggWcffbZfPzxx+zYsYOZM2dWe7uOHTsyYsQIPv/8c55++mlS/AdRt25dfP5uPWstXbp0Yfbs2YDTC9elS5cq9/fqq68yaNAgJkyYQL169YJ0FoJLwUtERCSKZGeDx/PTNo/HaXdDWloaL7zwAn369GHTpk2kp6dXe7s77riDadOm0a9fP1566SXatGkDwIUXXsiUKVM4++yzmTlzJrfffjtLliyhX79+rFy5kltuuaXK/V144YWMHj2a888/H4D169eH7TxUl7E28m+DmJ6ebnNzc90uQ0REJCS+++47TjnllGpv7/U6Y7oKC52eruzs4A+sl+qp6rUzxsy11laZQDXGS0REJMpkZChoRStdahQREREJEwUvERERkTBR8BIREREJEwUvERGXuH3bFxEJPwUvEREXlN/2paAArD102xeFL3FTpNwkuyaOpZb+/fsHr5BqUvASEXFBOG/7IjFojRempsH4BGe5JryJPdQ3ya6JSKqlOhS8RERcEM7bvkiMWeOFOZngKwCss5yTGZLw1b9/fx588EEuuuiin7WX279/PwMGDKBfv35cddVVlJSUVLmv7Oxspk6dCsDo0aOZPHkyPp+PQYMG0a9fP+6+++6Az3u456hYS1FREYMHD6Zv374MGDAAn8/HgQMHGDJkCOeeey4ZGRkcPHiwyvoCbRfoHBwtBS8REReE87YvEmMWjILSSt2lpT6nPciCeZPsa6+9lmnTpgEwY8YMLr300ipvkl3V81b1HFXJycmhe/fuzJo1i2uuuYbFixdXeYPtqgTarjrnoCY0gaqIiAuys50xXRUvN7p52xeJIr4A3aKB2o9BMG+SDbBu3Tp2795N48aNqVevXsCbZFd+3qqeoyrLli3jmmuuAeCWW24B4J///OfPbrBdlapuxF3dc1AT6vESEXFBRgbk5EBqKhjjLHNyNBu5VIMnQLdooPZjEMybZAP06tWLMWPGcMUVVwAEvEl25eet7nN06tSJb7/9FoA//OEPvPLKK1XeYLsqgbarzjmoCQUvERGXZGRAfj6UlTlLhS6plu7ZkFjpLtmJHqfdBdW9STbAtddey5gxYxgwYABAwJtkH+1z3HHHHcybN4/+/fszb948brzxxipvsF2V6m53rHSTbBEREZfV9CbZrPE6Y7p8hU5PV/dsaKvk7gbdJFtERCTWtc1Q0IpSutQoIiISAaLhCpT81NG8ZgpeIiIiLktOTmbbtm0KX1HEWsu2bdtITk6u0ffpUqOIiIjLWrduzbp169iyZYvbpUgNJCcn07p16xp9j4KXiIiIy2rVqkXbtm3dLkPCQJcaRURERMJEwUtEREQkTBS8RERERMJEwUtEREQkTBS8RERERMJEwUtEREQkTBS8RERERMJEwUtEREQkTBS8RERERMJEwUtEREQkTBS8RERERMJEwUtEREQkTBS8RERERMJEwUtEREQkTBS8RERERMJEwUtEREQkTBS8RERERMJEwUtEREQkTBS8RERERMJEwUtEREQkTBS8RERERMJEwUtEREQkTBS8RERE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\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画布大小\n",
    "plt.figure(figsize=(10,10))\n",
    "\n",
    "# 中文标题\n",
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "plt.title('鸢尾花线性数据示例')\n",
    "\n",
    "plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa',)\n",
    "plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor')\n",
    "\n",
    "# 画感知机的线\n",
    "x_ponits = np.arange(4, 8)\n",
    "y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]\n",
    "plt.plot(x_ponits, y_)\n",
    "\n",
    "# 其他部分\n",
    "plt.legend()  # 显示图例\n",
    "plt.grid(False)  # 不显示网格\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**注意 !**\n",
    "\n",
    "在上图中，有一个位于左下角的蓝点没有被正确分类，这是因为 SKlearn 的 Perceptron 实例中有一个`tol`参数。\n",
    "\n",
    "`tol` 参数规定了如果本次迭代的损失和上次迭代的损失之差小于一个特定值时，停止迭代。所以我们需要设置 `tol=None` 使之可以继续迭代："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x1d85f0d8848>"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAl4AAAJYCAYAAACzeOibAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdeXxU5b3H8c+TCduwiCyiiMkgoKggCCGAepFaba21VhHcwioYJFpre1trr7a9WqO9trV2Q4yswoCgdalaq9WKWgVCwi6KICRh3/cQIMlz/zgTgZCBCczMOTP5vl+vvE7OMydnfudMMnx5zjPnMdZaRERERCT2UtwuQERERKSuUPASERERiRMFLxEREZE4UfASERERiRMFLxEREZE4UfASEU8zxrSJ4r5aGmNSo7U/EZHaUvASkVozxjQ1xgwLfX+ZMWacMeaMKO17mDEmeFTTmhNse50x5uKj1gcaY64yxoR7b3sX6FBtH78wxjxUw77vM8Y0NMb82xjT1RjzU2NMM2PMc8aYfmHquc0Y0/6EB3gajDE3G2PGnODxh6MZVEUk+vQ/PxE5FQeAbGNMJfB3oBS4zRjTFLgA+AtwOfAYsDbMPtoDt1tr/xUKSqnW2kPAIWD/UdsdrvrGGNMIOGytLQ/9zO+BIUdtewVQBFxjjNljrf1ttec8GNo/xphcYE6orbyG+lKBR0KPNQ7V+ltjzNXA/4U5pu+GjneNMWYXsOyox1KAcmvt16HNGDMd6FJV01F8QLG19qZq7UOB140x7wGXAl8AS62194Yevw6YFKY2EfEABS8RiYgxpjcwCGiIE0aWAw/hhJB/As1DbW/ihJ/uOGEj3PuMOer7y4BxxpiDQCvgDGPMf0KPNT7q+/rAfUA+MBh4BSgzxnzTWvs+TmArA34D3GKMybTW5htjTOhnK4HvGmOmAT2B14DOQGXVNtbag8aYhsAGwAJnAv2Bj0I9XU2statD56RBaPsmoe0aAC2MMa2BNdbaK486f01C5+Zr1to7w57w6ifLmDTgG8AdwCxgUVWIM8bMBUYBFaFjFBGPUvASkUgtA1Zaa3cAGGOygXFA19BXMTAb+DVOMLDAVGvtj6t2EAoknULbr7DWzgaw1hYCvULb3AZcZq19yBjTCph/dIAJbdMJGANcD4wHlhhjWuL0sp0L3ArsAPw4IS0ttB04PUzDccLes0CbUK1DcHqrbsIJaf2ATCAD+Dy0vzFAijGmILTPvcaY7qF93RfatjlwIXBuKDAanB6zUmBPbU54Nb8C9llry4wxPYByY8xgYCWwl2N7CUXEoxS8RCQi1tr9wH5jzFMcCSTLcQIFOL1hHYCdwHygI2CNMW8A5+CEmy7AVGA10LT6c4R6nb4PrAo1PQg8EXpsAE4vz2qcS2rnAB8Dm3GC3jBgBfCxtfZXoUuRPUOBrDNOeOoRev5RQIG19rvGmJ/gXAJ85qhSDoRqPBenB21X6LguB/5irf21MeZF4PfW2r3ARzg9YpOBCTgB6w5r7ZXGmDOBt6y1lx91nE1xAuGh0HkJJxW4HWgNXBOqBeDm0DnuA1yC09Ol+d9EEoCCl4jUVmfgJziX1g5Zaz8EMMZ8ATxpQxPAGmP8OMFiCE7Iagn8C3gPJzT9lzHmY2vtrtD29XF6pS446hLcIeCwMeZ2nAB2O04gGmut/bMxZiZOT1AJzmW8LGCAMeYKoEmo/RHgLOA/OMFrPc64tBP1PrUDtuEEv8dCz3ETUA/nEiU4PV5fVf1A6NOSrXCC1yNAp1DPWMpR3xvgz9baycaYy4CDR52vgcCV1toHQusmdAwHcC7tZgN/NMacC4zECV0344yBu+wExyIiHqLgJSK1VdWzshn4tTGmCHgeWFcVIkKaAvuAh3EuL27BGQOVBmzE6Z0qBQh9EnA6Tg/avmrPdx9OSOprrd1cVUPok4jrcQbHX4ITypYDvYEbccJJobX2S+DL0PPcD2CtfdUY86Qx5vc4gdCGPqW51Fo7FGgB/Ah4FCc4vYETcC4HZod6sZoeddn1cpxB7Q1xBsAvABZaa/tXje0Kff/1e27okmELY8wrwLer2kP7/h0wOtSbBs4g+i+cLMaVwHPAqzhBLjt0vCKSAHQ7CRGprVScf+wHAAuBETjjjP5jjPlfY8yI0HZtccYevYLTk1U13qkjTk/NwziD4MG5lPc48CQ4vV/GmOE4lw/nA9ccFbrAGZf1Q5werF8DPmvtfdbaPwONcMZijeEE456stT+31nYH/gg8ba29LBS6qsacXQnsxvmU5lM4Y9IOhI7nNeDfR+3uC5zw8wFOEDwPWG+MeQt4G+hujJkN5Flrj/4E5c9xLnkePKqunTi9XH8OU/dMa+2joXPTFijECXy+cMcqIt6hHi8Rqa17cAaLV2dwepuux+n96YzT0/RbnGBWjBNKZuAMYt+GEzCqwsZbxpiOoX09BKTjXJqcZ62tBDDGnGWt3WKt3QicY4xpjPPpyQuAuaFxXcU4vVU9gK2ncZxtgQKcT2x2Bn4Zan8FJzD+umrDUM/XjlCPFDiXAQuBO621GV+fIOdyY9X3l+OMZ6vpMuGPgA+NMaOttc+FqW8kMN5aa0MfdFhX6yMUkbhT8BKRiBhj2gEv4VwKrDj6IZwgNiX02BpjTAOcsVC3WGvHHbWPH1SNCQutv26M+T9r7adH7ctYax8LPf44zripqjFgbxljforz3jUF2ITTk/a+MaYr8CecsNcOJ/xcZoxZa62dGNp/KuAzxtQDbLXep6rnKA8FvVXAizhjvB4GLg0N8H8EZ4xbnjFmmLX246N2kYIzHuu60HYnul3EM8CY0IcWwPkkJTiFHTbG3AGMNcY8XxU8gdTQ2K8HcC5P9gq1b8C5L1prjr8nmIh4iIKXiETEWrsO6BvucWPMr3EuOw7Huey2NHRp7mgrjDGf4fR0Vb3/LD7q8QahryofAY+GBtdbnDFcH+MEtF7W2g2h5/4+zuD6B0LjtwI4PVVtObZHqR5OwLkLuMsYc/TNWQeGnvseY8znwFvAImCAtXZT6NYNOTg3Uv3SGFMI/NIYc5O1dr8xJgfnct9+53TZL40xVbeUOPr4qvxX1SVGY8xzwEBgdNWD1tpinBuyHq0pTk/g94BvHxXaUnB6Bz+sGncmIt5kjh0LKyJyaowxZ+N8Sm9naP1ca+36OD5//dCd779eB5pZa7fFq4YaampUQ/isabsWwIFIthWRxKbgJSIiIhIn+lSjiIiISJwoeImIiIjESUIMrm/VqpUNBAJulyEiIiJyUoWFhdusta1reiwhglcgEKCgoODkG4qIiIi4zBhTHO6xmFxqNMa0McYsDPNYqjGmxBgzO/TVNRY1iIiIiHhNrHq8foczbUdNLgVmWGt/FqPnFhEREfGkqPd4GWOuxrmB4KYwm/QBbjDG5BtjJhw9aayIiIhIMotq6AndsPAXOBPgvhZms6oJbzcaY17Amdft7zXsKxtnIl7S0tKiWaaIiIinHD58mHXr1lFWVuZ2KVILDRs2pF27dtSrVy/in4l2b9NDwFhr7a6jJoutbknVNBk4E9B2qmkja20ekAeQkZGhu7yKiEjSWrduHU2bNiUQCHCCfz/FQ6y1bN++nXXr1tG+ffuIfy7alxqvAe41xswGuhtjxtewzVRjTDdjjA+4iWPnaRMREalzysrKaNmypUJXAjHG0LJly1r3Uka1x8ta2++ogmYDTxtjHrfWPnLUZo8B03Emuf27tfa9aNYgIiKSiBS6Es+pvGYxG9hure0f+vaRau3LcD7ZKCIiIlKnaMogERERAaBjx44RbffAAw/EtI5FixaxaNGimD6HWxS8REREEkwwCIEApKQ4y2Awvs//zDPPxHT/yRy8dA8tERGRBBIMQnY2lJY668XFzjpAVlZ0n6t///706tWLJUuW8M477xzTPnv2bAAOHDjAoEGD2LNnDy1btuSll14iNfX4eFHTdocOHWLo0KFs2bKFrl278te//pWf//znvPrqqwBMnTqV999/n4MHDzJ8+HA2bNhAu3btmDRpEhUVFcftr6ysjIEDB7J//346duzIpEmTontCokA9XiIiIgnk4YePhK4qpaVOe7TNnTuXvn37HhO6qlu+fDkpKSl89NFHjBgxgn379jF69Gj69+//9ddjjz1W43Z5eXl06dKFjz76iI0bN7JkyRKefPJJHnroIR566CHef/99AJ5//nm6dOnChx9+SKdOnZg4cWKN+9u4cSM/+MEPeO+99ygqKmLz5s3RPymnST1eIiIiCaSkpHbtp6NLly4MGDDghNv06NGDLl268K1vfYtOnTpx3XXX8dxzzx23nbX2uO1WrFjBp59+yuzZs9m1axfr16/n0kuP//zd8uXLv66jT58+vP3224wePfq4/dWrV4/x48czadIkduzYwYEDB6JzIqJIPV4iIiIJJNxkLrGY5KVJkyYn3Wbx4sVcccUVvPvuu+zcuZOPP/444u0uvPBCHnjgAWbPns3jjz/+9Uw1jRo1ojTUrWet5ZJLLmHu3LmA0wt3ySWX1Li/CRMmMHDgQGbMmEHjxo2jdBaiS8FLREQkgeTmgt9/bJvf77S7IRAI8Kc//YnLL7+cTZs2kZGREfF2d999N2+//Tb9+vVj3LhxnHfeeQBce+21vPLKK1xxxRV8/PHHjBo1is8++4x+/fqxcuVKhg8fXuP+rr32Wp588kmuvvpqANavXx+38xApY633Z+PJyMiwBQUFbpchIiISE59//jkXXXRRxNsHg86YrpISp6crNzf6A+slMjW9dsaYQmttjQlUY7xEREQSTFaWglai0qVGERERkThR8BIRERGJEwUvERERkThR8BIRcYnb076ISPwpeImIuKBq2pfiYrD2yLQvCl/iJq9Mkl0bp1NL//79o1dIhBS8RERcEM9pXyQJrQnCawGYnuIs18Q3scd6kuza8FItkVDwEhFxQTynfZEksyYI+dlQWgxYZ5mfHZPw1b9/f37605/y7W9/+7j2KgcOHOCGG26gX79+3HzzzZSXl9e4r9zcXF577TUAnnzySV566SVKS0sZOHAg/fr149577w37vCd6jqNrKSsr4/bbb+fKK6/khhtuoLS0lIMHD3LHHXdw1VVXkZWVxaFDh2qsL9x24c7BqVLwEhFxQTynfZEks/hhqKjWXVpR6rRHWTQnyR40aBBvv/02AB999BHXX399jZNk1/S8NT1HTfLy8ujWrRv/+c9/uOWWW1i2bFmNE2zXJNx2kZyD2tANVEVEXJCb64zpOvpyo5vTvkgCKQ3TLRqu/TREc5JsgHXr1rFnzx6aN29O48aNw06SXf15a3qOmnzxxRfccsstAAwfPhyAyZMnHzfBdk1qmog70nNQG+rxEhFxQVYW5OVBejoY4yzz8nQ3comAP0y3aLj20xDNSbIBMjMzeeaZZ7jxxhsBwk6SXf15I32Ozp07M3/+fACeeOIJxo8fX+ME2zUJt10k56A2FLxERFySlQVFRVBZ6SwVuiQi3XLBV22WbJ/faXdBpJNkAwwaNIhnnnmGG264ASDsJNmn+hx33303CxYsoH///ixYsIAhQ4bUOMF2TSLd7nRpkmwRERGX1XaSbNYEnTFdpSVOT1e3XGiv5O4GTZItIiKS7NpnKWglKF1qFBER8YBEuAIlxzqV10zBS0RExGUNGzZk+/btCl8JxFrL9u3badiwYa1+TpcaRUREXNauXTvWrVvH1q1b3S5FaqFhw4a0a9euVj+j4CUiIuKyevXq0b59e7fLkDjQpUYRERGROFHwEhEREYkTBS8RERGROFHwEhEREYkTBS8RERGROFHwEhEREYkTBS8RERGROFHwEhERkTphy54yDldUulqDgpeIiIgkvdVb93Hz2E/51d8/c7UO3bleREREktpnG3YzbGI+1sKdmWmu1qLgJSIiIkmroGgHIybPp2mDVKaO6k2H1k1crUfBS0RERJLSh19uZfTUAtqe0Yipo3pzbvNGbpek4CUiIiLJ5x9LN/LDFxfS6aymvDAyk1ZNGrhdEqDgJSIiIklm5vwSfv7KUnqkncmE4b04o1E9t0v6moKXiIiIJI3nP1pN7j8+p98FrXlucE8a1fe5XdIxFLxEREQk4VlrefpfX/Lnf6/iu13P4Q+3dad+qvfumqXgJSIiIgmtstLy6BufMWVOMbdlnMcTA7riSzFul1UjBS8RERFJWIcrKnnw5SW8unA92f3O5+ff6Ywx3gxdoOAlIiIiCarscAX3TV/Ie59v5qffvpCc/h08HbpAwUtEREQS0L6D5dw9pYA5q7fz2PcvYWjfgNslRUTBS0RERBLKzv2HGD55PsvW7+YPt3Xj5svauV1SxBS8REREJGFs3lPGkAnzKNpeyrjBPbn24jZul1QrCl4iIiKSEEq2l5I1YS479h1i8oheXN6hldsl1ZqCl4iIiHjeik17GTJhHocqKgne3Yfu5zV3u6RTouAlIiIinrZo7S6GT8qnvi+FWaP7ckGbpm6XdMq8d0tXEZEYCwYhEICUFGcZDLpdkYiE8+mqbWQ9P5dmDevx8j2XJ3ToAvV4iUgdEwxCdjaUljrrxcXOOkBWlnt1icjx3v1sE/fNWEigpZ9pI3tzVrOGbpd02tTjJSJ1ysMPHwldVUpLnXYR8Y5XFqxjTHABF53TjJnZfZMidIF6vESkjikpqV27iMTflE+L+NXfP+PyDi3JG5pBkwbJE1fU4yUidUpaWu3aRSR+rLX8+f2V/Orvn3HtxW2YOLxXUoUuUPASkTomNxf8/mPb/H6nXUTcY60l963P+f2/vmTAZefybFYPGtbzuV1W1Cl4iUidkpUFeXmQng7GOMu8PA2sF3FTRaXlob8tZfx/1jCsbzq/G9SNVF9yRpTk6r8TEYlAVpaClohXHCyv4EczF/GPpZu4/+qO/OjaCzDGuF1WzCh4iYiIiCtKD5UzemohH6/cxiPfvYhR/3W+2yXFnIKXiIiIxN3uA4e5a/J8Fpbs5KlbLuXWXue5XVJcKHiJiIhIXG3de5ChE/NZtWUvf7mzB9d3PcftkuJGwUtERETiZv2uAwweP49Nu8sYP6wXV13Q2u2S4krBS0REROJi1ZZ9DJkwj30Hy5k2KpOe6S3cLinuFLxEREQk5pat383QifmkGJiZ3ZeL2zZzuyRXKHiJiIhITOWv2cHIyfNp1qgeU0dmcn7rJm6X5BoFLxEREYmZD1Zs4Z6phZx7ZiOmjexN2+aN3C7JVQpeIiIiEhNvLN7Aj2YuovM5TZkyIpOWTRq4XZLrFLxEREQk6mbkl/A/ry6lV3oLxg/PoFnDem6X5AkKXiIiIhJV4z78it+8/QX9L2zNs1k9aVQ/+Sa7PlUKXiIiIhIV1lp++84Kxs7+ihsuPYenb+1O/dTknOz6VOlsiEhEgkEIBCAlxVkGg25XJCJeUllp+cXryxg7+yvuyEzjj7dfptBVA/V4ichJBYOQnQ2lpc56cbGzDpCV5V5dIuINhysq+clLi3l90QbuuaoDP7vuQowxbpflSYqiInJSDz98JHRVKS112kWkbis7XME9Uwt5fdEGHrzuQh76TmeFrhNQj5eInFRJSe3aRaRu2Ft2mFFTCsgv2sGvb+rCkD7pbpfkeerxEpGTSkurXbuIJL8d+w+RNX4ehcU7eea27gpdEVLwEpGTys0Fv//YNr/faReRumfT7jJufW4OKzbtJW9oT77f/Vy3S0oYCl4iclJZWZCXB+npYIyzzMvTwHqRuqho234GjvuUTbvLmHJXJld3buN2SQlFY7xEJCJZWQpaInXdF5v2MHh8PhWVlUy/uzeXtmvudkkJR8FLRERETmpByU5GTJpPo3o+Ztzdl05tmrpdUkJS8BIREZET+s/KbWRPLaB10wZMG9mb81r4T/5DUiMFLxEREQnrn8s2cf+MhZzfujEvjMzkrKYN3S4poSl4iYiISI1eLlzHgy8vptt5zZk0vBfN/fXdLinhKXiJiIjIcSZ9soZH31jOlR1b8dyQnjRuoMgQDTqLIiIi8jVrLX98fyXPvLeS6y45mz/e0Z0GqT63y0oaCl4iIiICQGWl5ddvLWfSJ0UM7NmO3wzoSqpPt/yMJgUvERERobyikodeWcrLhesYcUWAX3z3YlJSNNl1tCl4iYiI1HEHyyv44YxF/POzTTxwTSd++M1OGKPQFQsKXiIiInXY/oPl3DOtkI9XbuOXN1zMXVe2d7ukpKbgJSIiUkftLj3M8Mn5LF67i98N6sbAnu3cLinpKXiJiIjUQVv2ljF0Qj6rt+5nbFYPrutyjtsl1Qkx+aiCMaaNMWbhCR6fYIyZY4x5JBbPLyJSVwSDEAhASoqzDAbdrkgSwdodpdw6bg4lO0qZOLyXQlccxeozor8DGtX0gDFmAOCz1vYFzjfGdIpRDSIiSS0YhOxsKC4Ga51ldrbCl5zYqi17GTRuDjv2H2LaqN5c2amV2yXVKVEPXsaYq4H9wKYwm/QHZoW+fxe4Mto1iIjUBQ8/DKWlx7aVljrtIjVZsm4Xg8bNobzSMnN0X3qknel2SXVOVIOXMaY+8AvgoRNs1hhYH/p+B9AmzL6yjTEFxpiCrVu3RrNMEZGkUFJSu3ap2+au3s6dz8/DXz+Vl+/py0XnNHO7pDop2j1eDwFjrbW7TrDNPo5chmwSrgZrbZ61NsNam9G6desolykikvjS0mrXLnXXv7/YzLCJ+Zx9RkP+NuZyAq0au11SnRXt4HUNcK8xZjbQ3RgzvoZtCjlyebEbUBTlGkRE6oTcXPD7j23z+512kSqvL1pP9guFXNCmKbNG9+XsMxq6XVKdFtXbSVhr+1V9HwpfTxtjHrfWHv3pxdeAj40xbYHvAH2iWYOISF2RleUsH37YubyYluaErqp2kWlzi/nF68vIDLRg/LAMmjas53ZJdZ6x1sb/SY05E7gW+MhaG24Q/tcyMjJsQUFB7AsTERFJEmNnr+Kpf67g6s5nMTarBw3r+dwuqc4wxhRaazNqesyVG6haa3dy5JONIiIiEiXWWv7vnysY9+FXfL97W343qBv1fLG6e5TUlu5cLyIikiQqKi2/eH0Z0+eVMLhPGo/d2IWUFE127SUKXiIiIkngUHklP561iDeXbCSnfwd++u0LMUahy2sUvERERBLcgUMV5AQL+WDFVh76TmfuuaqD2yVJGApeIiIiCWxP2WFGTS5gfvEOnri5K3f21o3cvEzBS0REJEFt33eQYZPy+WLjXv50+2V8r1tbt0uSk1DwEhERSUAbdh1gyIR5rN91gOeHZfCNC89yuySJgIKXiIhIglmzbT+Dx89jz4HDvHBXbzLbt3C7JImQgpeIiEgCWb5hD0Mn5lNpLTOy+9Dl3DPcLklqQcFLREQkQRQW72DEpPk0bpDK1JF96HhWE7dLklpS8BIREUkAH325ldFTCzn7jIZMHZlJuzP9J/8h8RzNISAiCSUnB1JTwRhnmZPjdkUisff20o2MnDKfQKvGzBrdV6ErganHS0QSRk4OPPvskfWKiiPrY8e6U5NIrM0qWMtDf1vCZWlnMnF4L85oVM/tkuQ0qMdLRBJGXl7t2kUS3fiPV/Pgy0u4omMrpo7MVOhKAurxEpGEUVFRu3aRRGWt5Q//+pI//XsV13c9mz/c1p0GqT63y5IoUPASkYTh89Ucsnz690iSSGWl5bE3lzP50yJuzWjHkwMuxZeiya6ThS41ikjCyM6uXbtIoimvqOQnLy9m8qdFjLqyPf93i0JXslGPl4gkjKoB9Hl5Ts+Xz+eELg2sl2RQdriC+2cs5N3lm/nvay/gvqs7YoxCV7JR8BKRhDJ2rIKWJJ99B8vJfqGAT7/azqM3XsKwywNulyQxouAlIiLiol2lhxg+aT5L1+/m6Vu7MaBHO7dLkhhS8BIREXHJlj1lDJmQz5pt+3k2qwffuuRst0uSGFPwEhERccHaHaVkjZ/Htn0HmTyiF5d3bOV2SRIHCl4iIiJx9uXmvQweP49DFZVMv7sP3c9r7nZJEicKXiIiInG0eO0uhk3Kp74vhZnZfbnw7KZulyRxpOAlIiISJ3O+2s6oKfNp0aQ+00b2Jr1lY7dLkjhT8BIREYmD95ZvJmf6AtJb+Jk2qjdtmjV0uyRxgYKXiIhIjL26cB0/eWkJXdo2Y/KITM5sXN/tksQlCl4iIiIxNHVOEb94/TP6nt+S54dl0KSB/umty/Tqi4iIxIC1lrGzv+K376zgmova8Jc7L6NhPc3oXtcpeImIiESZtZYn3/6CvI9Wc/Nl5/LUwEup50txuyzxAAUvERGRKKqotDz86lJenL+WoX3T+d/vXUJKiia7Fofit0gdcc01YMyRr2uucbsiCQYhEICUFGcZDLpdkZyuQ+WV3D9jIS/OX8sPru7IozcqdMmxFLxE6oBrroH33z+27f33Fb7cFAxCdjYUF4O1zjI7W+ErkR04VMHdLxTw1tKNPHz9Rfz3ty7EGIUuOZax1rpdw0llZGTYgoICt8sQSVgneu9PgLeApBQIOGGruvR0KCqKdzVyunYfOMzIyfNZULKTJwd05bZeaW6XJC4yxhRaazNqekxjvEREXFBSUrt28a5t+w4ydEI+K7fs5S939uD6rue4XZJ4mC41ioi4IC1Mh0i4dvGm9bsOcOu4Oazeto/xw3opdMlJKXiJ1AHf/Gbt2iX2cnPB7z+2ze932iUxrN66j0HPfsrWfQeZNrI3V13Q2u2SJAEoeInUAe+9d3zI+uY3nXZxR1YW5OU5Y7qMcZZ5eU67eN+y9bsZNG4OB8sreTG7DxmBFm6XJAlCg+tFRERqYX7RDu6aNJ+mDVOZNqo357du4nZJ4jEaXC8iIhIFs1ds4Z5phbRt3ohpI3vTtnkjt0uSBKPgJSIiEoG3lmzkgZkL6XRWU14YmUmrJg3cLkkSkIKXiIjISbyYX8L/vLqUnulnMn5YL85oVM/tkiRBKXiJiIicQN5HX/HEP77gqgtaM25wTxrV97ldkiQwBS8REZEaWGv5/btf8pcPVvHdS8/hD7d2p36qbgYgp0fBS0REpJrKSsv/vvEZL8wp5o7M83j8pq74NNm1RIGCl4iIyFEOV1Ty4MtLeHXhegBzhREAACAASURBVEb3O5+HvtNZk11L1Ch4iYiIhJQdruC+6Qt47/Mt/PTbF5LTv4NCl0SVgpeIiAiw72A5d08pYO6a7fz6pi4M6ZPudkmShBS8RESkztu5/xDDJ+WzbMMe/nBrd2667Fy3S5IkpeAlIiJ12qbdZQyZMI/iHaU8N7gn11zcxu2SJIkpeImISJ1VvH0/gyfMY8e+Q0wZkUnfDi3dLkmSnG5IIlJHBIMQCEBKirMMBhOzBi8chySHFZv2MnDcHPaVlTMju49Cl8SFerxE6oBgELKzobTUWS8udtYBsrISpwYvHIckh4UlOxk+aT4N66Uwa3RfOrVp6nZJUkcYa63bNZxURkaGLSgocLsMkYQVCDghpbr0dCgqSpwavHAckvg+WbWNu18ooFWTBgRH9ea8Fn63S5IkY4wptNZm1PSYerxE6oCSktq1e7UGLxyHJLZ3PtvED6YvpH2rxkwdmclZzRq6XZLUMRrjJVIHpKXVrt2rNXjhOCRxvbJgHTnBBVzcthkzR/dR6BJXKHiJ1AG5ueCvdjXF73faE6kGLxyHJKbJn6zhx7MW0+f8FgRH9aa5v77bJUkdpeAlUgdkZUFenjMWyhhnmZcX3wHp0ajBC8chicVay5/eX8n/vrGcb13chgnDetG4gUbZiHs0uF5ERJKStZbH3/qcCf9Zw4Ae5/LULZeS6lN/g8SeBteLiEidUlFp+fkrS5hVsI7hlwf45Q0Xk5Kiya7FfQpeIiKSVA6WV/DAi4t4e9kmfvjNTjxwTSeMUegSb1DwEhGRpFF6qJzRUwv5eOU2fnHDxYy8sr3bJYkcQ8FLRESSwu7Sw9w1ZT4LS3by1MBLuTXjPLdLEjmOgpeIiCS8rXsPMmTCPFZv3c/YrB5c1+Uct0sSqZGCl4iIJLR1O0sZMiGfTbvLmDA8g//q1NrtkkTCUvASEZGEtWrLPoZMmMf+g+VMG9Wbnulnul2SyAkpeImISEJatn43Qyfmk2IMM0f35aJzmrldkshJKXiJiEjCyV+zg5GT59OsUT2mjepN+1aN3S5JJCIKXiIiklA++GIL90wrpN2ZjZg2qjfnnNHI7ZJEIqbgJSIiCeONxRv40cxFdD6nKVNGZNKySQO3SxKpFU1aJZ4UDEIgACkpzjIYdLuiUxeNY0mm8yFyqqbPK+H+FxfSI/1Mpt/dR6FLEpJ6vMRzgkHIzobSUme9uNhZB8jKcq+uUxGNY0mm8yFyqsZ9+BW/efsLru58FmOzetCwns/tkkROibHWul3DSWVkZNiCggK3y5A4CQSccFFdejoUFcW7mtMTjWNJpvMhUlvWWp56ZwXPzv6KG7u15fe3dqOeTxdrxNuMMYXW2oyaHlOPl3hOSUnt2r0sGseSTOdDpDYqKy2/eH0ZwXklZPVO47Hvd8GXosmuJbHpvw3iOWlptWv3smgcSzKdD5FIHa6o5IGZiwjOK2FM/w48fpNClyQHBS/xnNxc8PuPbfP7nfZEE41jSabzIRKJssMVjJ5ayN8Xb+Bn13XmZ9d1xhiFLkkOCl7iOVlZkJfnjGEyxlnm5SXmQPJoHEsynQ+Rk9lbdphhE/P5YMUWcm/uwpj+HdwuSSSqNLheREQ8Ycf+QwybmM/nG/fw9G3dubFbW7dLEjklGlwvIiKetnH3AYZMyGftjlLyhvbk6s5t3C5JJCYUvERExFVF2/aTNX4euw8c5oW7Mul9fku3SxKJGQUvERFxzecb9zBkQj6V1jLj7j50bXeG2yWJxJSCl4iIuKKweCcjJuXjr5/KtFF96HhWE7dLEok5BS8REYm7j1duJfuFQto0a8DUkb05r4X/5D8kkgQUvEREJK7+uWwT989YyPmtG/PCyEzOatrQ7ZJE4kbBS0RE4ualgrX87G9L6H5ecyYNz+QMfz23SxKJKwUvERGJi4n/WcNjby7nvzq14rkhPfHX1z9BUvfot15ERGLKWssz763kj++v5LpLzuaPd3SnQarP7bJEXKHgJSIiMVNZafn1W8uZ9EkRg3q248kBXUn1abY6qbsUvEREJCbKKyp56JWlvFy4jpFXtufh6y8iJUWTXUvdFpPgZYxpAfQEFlprt8XiOURExLsOlldw/4yFvPPZZn587QX84OqOGKPQJRL1/l5jzJnAm0Am8IExpnUN26QaY0qMMbNDX12jXYdIMsnJgdRUMMZZ5uTEfx/BIAQCkJLiLIPB2tfgFcl0LF60/2A5IycX8M5nm/nV9y7m/m92UugSCYlFj9elwI+ttXNDIawH8E4N28yw1v4sBs8vklRycuDZZ4+sV1QcWR87Nj77CAYhOxtKS5314mJnHSArK7IavCKZjsWLdpUeYsTk+SxZt5vfD+rGLT3buV2SiKcYa21sdmxMP+Bx4AZr7Z5qj+UA9wL7gaXAaGttebh9ZWRk2IKCgpjUKeJ1qalOUKrO54PysH810d1HIOAElOrS06GoKLIavCKZjsVrtuwtY+iEfFZv3c+f77yMb19yttslibjCGFNorc2o6bGYfLTEOH3KtwE7gcM1bDIfuMZamwnUA66vYR/ZxpgCY0zB1q1bY1GmSEKoKTCdqD0W+ygpqV27lyXTsXjJ2h2lDBo3h5IdpUwa0UuhSySMmAQv67gXWALcWMMmS6y1G0PfFwCdathHnrU2w1qb0br1ccPEROoMX5jbHYVrj8U+0tJq1+5lyXQsXrFy814GjvuUXaWHmTaqN1d0bOV2SSKeFYvB9T8zxgwNrTYHdtWw2VRjTDdjjA+4CVgc7TpEkkXV+KNI22Oxj9xc8Febw9jvd9oTTTIdixcsWbeLW5+bQ6WFmaP70CPtTLdLEvG0WPR45QFDjDEfAT5gnTHm8WrbPAZMBRYBc6y178WgDpGkMHYsjBlzpHfK53PWIx1YH419ZGVBXp4zDsoYZ5mXl5iD0ZPpWNw2d/V27nx+Hk0apvLyPX3pfHYzt0sS8byYDa6PJg2uFxHxlvc/30xOcAFpLfxMHdmbs89o6HZJIp5xosH1unO9iIjUyuuL1vPfsxZzcdtmTBmRyZmN67tdkkjC0IRZIiISsalzi3lg5iIyAmcSHNVboUukltTjJSIiEfnrB6v47TsruOais/jLnT1oWK8WH60VEUDBS0RETsJay2/++QXPfbiam7q35beDulHPpwsmIqdCwUtERMKqqLQ88toyZuSXMKRPOo/eeAkpKZp3UeRUKXiJiEiNDpVX8uNZi3hzyUbu/UYHfvKtCzXZtchpUvASEZHjHDhUwZhgIbNXbOV/ru9Mdr8ObpckkhQUvERE5Bh7yg4zanIB84t38JsBXbk9U/MpiUSLgpeIiHxt+76DDJ2Yz5eb9/LnOy7jhkvbul2SSFJR8BIREQA27DrA4Anz2LDrAM8PzaD/hWe5XZJI0lHwEhERVm/dx5AJ+ew5cJipI3vTK9DC7ZJEkpJuxCKeFAxCIAApKc4yGHSnjpwcSE11JlNOTXXWE7WO0z2nek2S1/INe7j1uTmUHa5gRnafUwtda4LwWgCmpzjLNS79goh4nbXW8189e/a0UndMm2at328tHPny+532eBoz5tgaqr7GjEm8Ok73nOo1SV7z12y3XX71T9v3iffsqi17T20nq6dZ+6Lf2iBHvl70O+0idRBQYMNkGuM87m0ZGRm2oKDA7TIkTgIBKC4+vj09HYqK4ldHaipUVBzf7vNBeXli1XG651SvSXL68MutjJ5aQNszGjF1VG/Obd7o1Hb0WgBKa/gF8afDTUWnU6JIQjLGFFprM2p6TGO8xHNKSmrXHis1/QN/onYv13G651SvSfL5x9KN/PDFhXQ6qykvjMykVZMGp76z0jC/COHaReowjfESz0kLc8ugcO2x4gsz/2+4di/XcbrnVK9Jcpk1fy33TV9At3bNmZHd5/RCF4A/zC9CuHaROkzBSzwnNxf8/mPb/H6nPZ6ys2vX7uU6Tvec6jVJHuM/Xs2Df1vClZ1aM3Vkb85oVO/0d9otF3zVfkF8fqddRI4VbvCXl740uL7umTbN2vR0a41xlvEexF1lzBhrfT5nALfP594g7mjUcbrnVK9JYqusrLS/e+cLm/6zN23OtEJ78HBFdJ9g9TRrX023NmicpQbWSx2GBteLiNRdlZWWR9/4jClzirkt4zyeGNAVX4omuxaJFQ2uFxGpo8orKvnpy0t4deF6svudz8+/0xljFLpE3KLgJSKSpMoOV/CDGQv51/LN/PTbF5LTv4NCl4jLFLxERJLQvoPlZL9QwKdfbeex71/C0L4Bt0sSERS8RESSzs79hxg+eT7L1u/mD7d14+bL2rldkoiEKHiJiCSRzXvKGDJhHkXbSxk3uCfXXtzG7ZJE5CgKXiIiSaJkeymDJ8xj+76DTB7Ri8s7tHK7JBGpRsFLRCQJfLl5L4PHz+NQRSXBu/vQ/bzmbpckIjVQ8BIRSXCL1u5i+KR86vtSmDW6Lxe0aep2SSIShoKXiEgC+/Srbdw9pYCWTRowbWRv0lr6T/5DIuIaBS8RkQT1r+WbuXf6Atq3bMzUkZmc1ayh2yWJyEkoeImIJKBXF67jJy8tocu5ZzBlRC+a++u7XZKIRCDF7QJERKR2pnxaxI9mLqZ3+xYER/VW6BJJIApeIgkgGIRAAFJSnGUw6M4+xF3WWv7y75X86u+fce3FbZg4vBdNGujCRVStCcJrAZie4izX6A9Fokt/sSIeFwxCdjaUljrrxcXOOkBWVvz2Ie6y1vLEPz7n+Y/XMKDHuTx1y6Wk+vR/56haE4T8bKgI/aGUFjvrAO31hyLRYay1btdwUhkZGbagoMDtMkRcEQg4Qam69HQoKorfPsQ9FZWW/3llKTML1jL88gC/vOFiUlI02XXUvRZwwlZ1/nS4qSje1UgCM8YUWmszanpMPV4iHldSUrv2WO1D3HGwvIIfzVzEP5Zu4v6rO/Kjay/AGIWumCgN8wcRrl3kFKifWsTj0tJq1x6rfUj8lR4qZ9SUAv6xdBOPfPcifvytCxW6Yskf5g8iXLvIKVDwEvG43FzwV7snpt/vtMdzHxJfuw8cZsiEfD5ZtY2nbrmUUf91vtslJb9uueCr9ofi8zvtIlGi4CXicVlZkJfnjMcyxlnm5dVuUHw09iHxs3XvQe7Im8uSdbv46509uLXXeW6XVDe0z4LMPGdMF8ZZZuZpYL1ElQbXi4h4yPpdBxg8fh6bdpcxbkhPrrqgtdsliUgtndbgemPMxcCNwNd36LPWPha98kREBGDVln0MmTCPfQfLmTYqk57pLdwuSUSiLJJPNc4CfgOsjXEtIiJ11rL1uxk2MR9jYGZ2Xy5u28ztkkQkBiIJXpuBGdbailgXIyJSF+Wv2cHIyfNp1qge00b1pn2rxm6XJCIxEjZ4GWOGhr5dDHxgjJkB7Aew1r4Qh9pERJLeByu2MGZaIW2bN2LayN60bd7I7ZJEJIZO1ONVdbOYxaGvqjbvj8YXEUkAbyzewI9mLqLzOU2ZMiKTlk0auF2SiMRY2OBlrZ0CYIxpaa3dXtVujLk1HoWJiCSzGfkl/M+rS+mV3oLxwzNo1rCe2yWJSBxEch+vl6qt3xuLQkRE6ornPvyKn7+ylKsuaM2UuzIVukTqkBON8boK6A8EjDG/DDU3BnbGoS4RkaRjreW376xg7OyvuOHSc3j61u7UT9V9rEXqkhON8SoCZgM3AR+G2g4AC2NbkohI8qmstPzy78uYNreEOzLTePymLvhSNO+iSF1zojFexUCxMWaStfbDcNuJiMiJHa6o5CcvLeb1RRu456oO/Ow6TXYtUldFcjuJXUd9D+h2EiIikSo7XMF90xfw3udbePC6C8np39HtkkTERZHcTuIOoAQoAC4DOgEKXiIiJ7G37DCjphSQX7SDX9/UhSF90t0uSURcFnZUp7V2SuiWEvWstdnW2jxr7ZgT/YwkvmAQAgFISXGWwWDi1pGTA6mpYIyzzMmJdpXx45XXRSK3Y/8hssbPo7B4J8/c1t3boWtNEF4LwPQUZ7lGv2CnRefTmzzyukQyZdBuY8zTODdRvQTYG9uSxC3BIGRnQ2mps15c7KwDZGUlVh05OfDss0fWKyqOrI8dG71a48Err4tEbtPuMgZPmMfaHaXkDe3J1Z3buF1SeGuCkJ8NFaFfsNJiZx2gvX7Bak3n05s89LoYa098I3pjTCowAGiPc8nxb9baQ3Go7WsZGRm2oKAgnk9ZJwUCzj/q1aWnQ1FRYtWRmuqErep8PigvP53q4s8rr4tEpmjbfgZPmMeu0sOMH5ZBn/Nbul3Sib0WcP4Rqs6fDjcVxbuaxKfz6U1xfl2MMYXW2oyaHjtpj5e1thyYFfWqxHNKSmrX7uU6agpdJ2r3Mq+8LnJyX2zaw5AJ+ZRXVDL97t5c2q652yWdXGmYX6Rw7XJiOp/e5KHXReO15GtpabVr93IdPl/t2r3MK6+LnNiCkp3c9txcfMYwa3TfxAhdAP4wv0jh2uXEdD69yUOvS9jgFRrXhTHmA2PMv0NfHxhj/h2/8iSecnPB7z+2ze932hOtjqoxUJG2e5lXXhcJ7z8rtzF4/Dya++vx0j196dSmqdslRa5bLviq/YL5/E671J7Opzd56HU50acafxxafsNae3Xo6xvW2qvjV57EU1YW5OU5Y4eMcZZ5efEfwB2NOsaOhTFjjvRw+XzOeqINrAfvvC5Ss38u28Rdk+eT1sLPS/f05bwW/pP/kJe0z4LMPGesC8ZZZuZpIPip0vn0Jg+9LicdXO8FGlwvIl70cuE6Hnx5Md3Oa87k4Zmc4ddk1yJymoPrjTHzgc+BQmABsNBauy+6JYqIJJZJn6zh0TeWc2XHVjw3pCeNG0Rydx4RqesiGVx/HfAecA3wDjA/phWJiHiYtZZn3vuSR99YznWXnM2E4RkKXSISsUjeLVYAnwBvAPeFJs8WEalzKistj7/1ORM/WcPAnu34zYCupPr04XARiVwk7xidgJeAG4CVxpgNsS1JRMR7yisqefBvS5j4yRpGXBHgqVsuVegSkVqL5F1jJtAFCAJdrLVtY1uSiIi3HCyv4L7pC3m5cB0PXNOJX95wMSkpxu2yRCQBRXLn+m/FoxARES/af7Cce6YV8vHKbfzyhou568r2bpckIglMI0JFRMLYXXqY4ZPzWbx2F78b1I2BPdu5XZKIJDgFLxGRGmzZW8bQCfms3rqfsVk9ua7L2W6XJCJJQMFLRKSatTtKGTJhHlv2HmTi8F5c2amV2yWJSJJQ8BIROcqqLXsZPD6f0kPlTBvVmx5pZ7pdkogkEQUvEZGQJet2MWxiPqm+FGbd05fOZzdzuyQRSTK6CY14UjAIgQCkpDjLYDBx68jJgdRUZ4Lr1FRnXbxn7urt3Pn8PPz1U3lptEKXCAD5OTAjFaYbZ5nv0hvYmiC8FoDpKc5yjUv/KERB2B4vY8wHQPUZtA1grbVXx7QqqdOCQcjOhtJSZ7242FkHyIrjRPLRqCMnB5599sh6RcWR9bFjo1ernJ5/f7GZMdMWcF4LP9NG9ubsMxq6XZKI+/JzYNVRb2C24sh6ZhzfwNYEIT8bKkJvxqXFzjpA+zj+oxAlxtrq2cp7MjIybEFBgdtlSJwEAk7IqS49HYqKEquO1FQnbFXn80F5+elUJ9Hy+qL1/PesxVx0TjOm3JVJi8b13S5JxBtmpDphqzrjgzvi+Ab2WsAJW9X50+GmovjVUQvGmEJrbUZNj2mMl3hOSUnt2r1cR02h60TtEl/T5hbzi9eXkRlowfhhGTRtWM/tkkS8o6bQdaL2WCkN86Ybrt3jTjrGyxjjM8b0Msb0C33dEY/CpO5KS6tdu5fr8Plq1y7xM3b2Kh55bRlXX3gWU+7KVOgSqc6EeaMK1x4r/jBvuuHaPS6SwfUvAz8AcoF7gRExrUjqvNxc8PuPbfP7nfZEq6NqTFik7RJ71lp+8/YXPPXPFXy/e1vGDelJw3pKwiLH6RDmjSpce6x0ywVftTdjn99pT0CRBK9WOGFri7X2NqBRbEuSui4rC/LynLFUxjjLvLz4DqyPVh1jx8KYMUd6uHw+Z10D691RUWl5+LVljPvwKwb3SeMPt3annk8f7hapUeZY6DjmSA+X8Tnr8RxYD84A+sw8Z0wXxllm5iXkwHqIYHC9MSYIvAl8D1gK3G6t7RaH2r6mwfUicroOlVfy41mLeHPJRnL6d+Cn374QY4zbZYlIEjrdwfVDgJbA28AA4NYo1iYiEnMHDlWQEyzkgxVbeeg7nbnnqg5ulyQidVSkn2q8EggAq4AvY1aNiEiU7Sk7zKjJBcwv3sETN3flzt6JOSBXRJJDJIMbXgS+CewHrgcS93axIlKnbN93kDufn8uCkp386fbLFLpExHWR9HidZa39+vJi6I72IiKetmHXAYZMmMf6XQd4flgG37jwLLdLEhGJKHiVGmMeAgqBTGC3Maaftfaj2JYmInJq1mzbz+Dx89hz4DAv3NWbzPYt3C5JRASI7FLjPKABcDlOUFsI9I9hTSIip2z5hj0MGjeHA4crmJHdR6FLRDzlpD1e1tpHjTFdgHOBEmCttXZfzCsTEamlwuIdjJg0n8YNUpk6sg8dz2ridkkiIseIZMqgPwOPAk8C5wPTY12UiEhtffTlVgaPz6dlkwa8dE9fhS4R8aRILjV2tdbeAuyy1r4FnBHjmkREauUfSzcycsp8Aq0aM2t0X9qd6T/5D4mIuCCSwfVbjTG/BM40xgwDNsW4JhGRiM2av5aHXlnCZWlnMnF4L85opMmuRcS7IunxGgrsBubg9HZpkmwR8YTxH6/mwb8t4YqOrZg6MlOhS0Q8L5Ier4PAJOAAzh3sfTGtSETkJKy1/OFfX/Knf6/i+q5n84fbutMgVW9NIuJ9kfR4vQT0A54GRgGvnuwHjDEtjDHXGmNanWZ9UgvBIAQCkJLiLIOnMMdANPaRTHJyIDUVjHGWOTm134del+iqXB3k0T8+yJ/+vYrbWn/Cn/t84U7oys+BGakw3TjL/FP45VgThNcCMD3FWa5x6YVVHckpGudTr0nURdLj1dJa+6Yx5j5r7XXGmE9OtLEx5kzgTeAt4GljzNXW2q01bDcBuBh4y1r7+KkUL0cEg5CdDaWlznpxsbMOkJUVv30kk5wcePbZI+sVFUfWx46NbB96XaKr/KsgD768mFd29mdUq1d5+OwJmAK/81/I9nE8Gfk5sOqoXw5bcWQ9M8JfjjVByM+GitALW1rsrEN8j0V1JKdonE+9JjFhrLUn3sCYN4AK4DPgE+B+a+11J9j+KuCgtXauMeZ3wL+ste9U22YAcKO1drgxZiLwpLV2Zbh9ZmRk2IKCgogPqi4KBJx/kKtLT4eiovjtI5mkpjphqzqfD8rLI9uHXpfoKTtcwf1P/4Z3d3bnv9tM5b6zZmJM6EF/OtxUFL9iZqQ6Yas644M7IvzleC3g/ENWXbyPRXUkp2icT70mp8wYU2itzajpsUh6vAYBF1trFxhjugG3nWhja+2HoSfthzPF0GM1bNYfmBX6/l2csWPHBC9jTDaQDZCWpoltT6akpHbtsdpHMqkpdJ2ovSZ6XaJj38Fysl8o4NOd3Xm07TiGtXrz2A1K43wyagpdJ2qvSbia430sqiM5ReN86jWJiZOO8bLWlllrF4S+X2yt3X2ynzHGGJyAthM4XMMmjYH1oe93AG1qeN48a22GtTajdevWJ3vKOi9cNq1NZo3GPpKJL8ywoXDtNdHrcvp2lR4ia/w85q3ZwdMdphwfugD8cT4ZJswvQbj2moSrOd7HojqSUzTOp16TmIhkcH2tWce9wBLgxho22Qc0Cn3fJFZ11CW5ueCvds9Iv99pj+c+kknVOKpI22ui1+X0bNlTxm3PzeXzDXt4NqsHA675PviqnQyfH7rF+WR0CPNLEK69Jt1yvXEsqiM5ReN86jWJiagHHmPMz4wxQ0OrzYFdNWxWiHN5EaAbUBTtOuqarCzIy3PG/RjjLPPyajf4Ohr7SCZjx8KYMUd6uHw+Zz3SgfWg1+V0rN1RysBxc1i7s5TJI3rxrUvOdgb0ZuY5Y0wwzjIzL/4DfTPHQscxR3q4jM9Zj3RgPXjnWFRHcorG+dRrEhMnHVxf6x06n2qcBTQAlgF/Be6w1j5y1DbNgI+B94HvAH1OdAlTg+tF6pYvN+9l8Ph5HKqoZPKITLqf19ztkkREIna6g+trxVq7E7i2WvMj1bbZY4zpH9ruqUjGjYlI3bB47S6GTcqnvi+Fmdl9ufDspm6XJCISNVEPXpEKBbRZJ91QROqMT7/axt1TCmjRpD7BkX1Ia6nJrkUkubgWvEREjvbe8s3kTF9Aegs/00b1pk2zhm6XJCISdQpeIuK6Vxeu4ycvLaFL22ZMHpHJmY3ru12SiEhMKHiJiKtemFPEL1//jL7nt+T5YRk0aaC3JRFJXnqHExFXWGv56wer+N27X3LNRW34y52X0bCeC5Ndi4jEkYKXiMSdtZYn3/6CvI9Wc/Nl5/LUwEup59N9lEUk+Sl4iUhcVVRaHn51KS/OX8vQvun87/cuISXFnPwHRUSSgIKXiMTNofJKfjRzEW8t3cgPru7Ij6+9AGdqVxGRukHBS0TiovRQOfdMW8BHX27l4esv4u5+57tdkohI3Cl4iUjM7T5wmJGT57OgZCf/d0tXbuuV5nZJIiKuUPASkZjatu8gQyfks3LLXv5yZw+u73qO2yWJiLhGHyOSYwSDEAhASoqzDAbdrkgS2fpdB7h13BxWb9vH+GG9kit0rQnCawGYnuIs15zCH0s09uEVXjkfXjinXqjBS3XIMdTjJV8LBiE7G0pLnfXiYmcdICvLvbokMX21dR9Dxs9j78Fypo3sTUaghdslRc+aIORnQ0Xoj6W02FkHaB/hH0s09uEVXjkfXjinXqjBS3XIcYy11u0aTiojI8MWFBS4XUbSCwScsFVdejoUxJlHpAAAIABJREFUFcW7Gklky9bvZtjEfABeGJnJJW3PcLmiKHst4PxDVp0/HW4qit8+vMIr58ML59QLNXipjjrKGFNorc2o6TH1eMnXSkpq1y5Sk/lFO7hr0nyaNkxl2qjenN+6idslRV9pmD+KcO2x2odXeOV8eOGceqEGL9Uhx9EYL/laWpgPmoVrF6lu9ootDJkwj9bNGvDymMuTM3QB+MP8UYRrj9U+vMIr58ML59QLNXipDjmOgpd8LTcX/P5j2/x+p13kZN5csoG7XyigQ+smzBrdl7bNG7ldUux0ywVftT8Wn99pj+c+vMIr58ML59QLNXipDjmOgpd8LSsL8vKcMV3GOMu8PA2sl5N7Mb+EH8xYSPfzmjMjuw+tmjRwu6TYap8FmXnOeBmMs8zMq92g5Wjswyu8cj68cE69UIOX6pDjaHC9iJyWvI++4ol/fMFVF7Rm3OCeNKrvc7skERFXaXC9iESdtZbfvbuCv37wFd+99Bz+cGt36qeqE13k/9u78/CoyoP94/eThWXYl7DviyACYRkSsC5o1Wq11VrXhtVgUKyttdVXX6w/f620fa2tfW0LNRL2EAW12Gptra1bFTNM2DcRCAmy79sASSbP+8eERmkSZmAyZ5bv57q4JueZE3PPk8dwc+bkHKAuFC8AIaustPp/f1qn+Z+U6O6Mrnr6lkFKTuJm1wBwLhQvACEp91fqkcWrtGTlTk2+opceu6G/jKF0AUAwKF4Agnaq3K/vLlyudzbs1SNf66cpo3tTugAgBBQvAEE5frpCk+YuU2HxQf30loEaO7K705EAIOZQvACc08ETZZow26N1O4/qN3cO0c1DOjsdCQBiEsULQJ12HzmlsXmFKjno0wtjhuuaAe2djgQAMYviBaBWJQdOKGtmoQ6dKNPciRka1buN05EAIKZRvADU6NPdxzQmr1AV/koV5IzU4C4tnY4EADGP4gXgP6woPaQJs5epUWqSFk0epb7tmzkdCQDiAsULwJd8tHm/7p3nVVqzhlqQnamurV3n/iQAQFC4vweAf/vbut2aOHuZurZyafHkUZSu+uaZIhWkSAtN4NEzxelEzmI+qhXnS0t6SAuTAo/F+U4nOn/x9FrCgCNeACRJrxZ9rkdfXa1BnVtozsQRaulq4HSk+OaZIm2eUb1t/dXbGdOdyeQk5qNacb7kyZH8vsC2rySwLUk9s5zLdT7i6bWECUe8AGjOR8X64eJVGtmrtfInZVK6ImFLbmjj8Y75qLZqanVROcPvC4zHmnh6LWHCES8ggVlr9fw/Nuu5dzbpugHt9fzdQ9UoNdnpWInB+kMbj3fMRzVfaWjj0SyeXkuYcMQLSFDWWj395gY9984m3Tqss6ZnDaN0RZKpZa5rG493zEc1V7fQxqNZPL2WMKF4AQmowl+pR19Zrbx/FWvCpT307G3pSknmx0FE9c4JbTzeMR/V0qdJyWf9YkuyKzAea+LptYQJbzUCCeZ0hV/fL1ipv67bre9/ta8euqavjDFOx0o8Z04Y35IbeDvNJAdKRqKdSH4G81HtzEnnq6YG3pJzdQsUlVg8GT2eXkuYGGut0xnOye12W6/X63QMIOb5yio0eX6RPvxsv3580wBlX9bT6UgAEHeMMUXWWndNz3HEC0gQR3zlmjjHo5XbD+uZ2wbrDndXpyMBQMKheAEJYO+xUxqX59HWfSc0PWuYrh/Y0elIAJCQKF5AnPv8kE9jZhZqz9HTypvg1uV905yOBAAJi+IFxLHNe49pzEyPfGUVWjApU8O7t3I6EgAkNIoXEKfWfH5E42d7lGSMXp48Shd3bO50JABIeBQvIA4Vbj2g7LletWicqgWTMtWzbROnIwEARPEC4s67G/fqvgVF6tKqsRZMylTHFo2djgQAqELxAuLIn1bt1MMvr9TFHZtrzsQRatO0odORAABfQPEC4kR+YYmeWLJWI3q0Vt54t5o1SnU6EgDgLBQvIA7MeG+L/uevG3V1/3bc7BoAohjFC4hh1lo987dPNeO9Lfpmeif96o50pXKzawCIWhQvIEb5K62efH2t8gtLlZXZTT+5eaCSk7jZNQBEM/5pDMSgcn+lHnp5pfILS3X/6N56+pYIlK7ifGlJD2lhUuCxOL9+v160i5b58EyRClKkhSbw6JniTI5omQ8gynHEC4gxp8r9mpK/XP/cuFf/dX1/3T+6d/1/0eJ8yZMj+X2BbV9JYFuSembV/9ePNtEyH54p0uYZ1dvWX72dMT1yOaJlPoAYwBEvIIYcO1WucbM8evfTvZr2rYGRKV2StGpq9V+qZ/h9gfFEFC3zsSU3tPH6Ei3zAcQAjngBMeLA8dMaP9ujjbuO6X/vGqpvpneK3Bf3lYY2Hu+iZT6sP7Tx+hIt8wHEAI54ATFg15GTuuOFpfpsz3G9OM4d2dIlSa5uoY3Hu2iZD1PLZUNqG68v0TIfQAygeAFRrnj/Cd02Y6n2HD2tefdk6Kr+7SIfIn2alOz68liyKzCeiKJlPnrnhDZeX6JlPoAYQPECotiGXUd1+x+W6mS5XwX3jlRmrzbOBOmZJWXkSq7ukkzgMSM3cU+cjpb5yJgu9bm/+giXSQ5sR/LEeil65gOIAcZa63SGc3K73dbr9TodA4ioopJDmjjboyYNUzQ/O1N92jV1OhIAIAjGmCJrrbum5zi5HohCH362TznzitS+eUMtmJSpLq1c5/4kAEDUo3gBUeatNbv0vZdWqHdaU83LzlC7Zo2cjgQACBOKFxBFFnm367FXV2tI15aaPSFDLVypTkcCAIQRxQuIEnn/KtZP31ivy/u21Qtjh8vVgP89ASDe8JMdcJi1Vs+985me/8dnumFgB/3mriFqmBLh6zABACKC4gU4qLLS6idvrNecj7fp9uFd9PNbByklmau8AEC8ongBDqnwV+rRV1frteU7lH1ZT039+sVKSjJOxwIA1COKF+CAU+V+fa9ghd5ev0cPX3uRHry6j4yhdAFAvKN4ARF24nSFcuZ79dHmA3rqGwM04Ss9nY4EAIgQihcQQYd9ZZowe5nW7DiiX92erm8P7+J0JABABFG8gAjZe/SUxuZ5VLz/hKZnDdPXLungdCQAQIRRvIAI2H7QpzF5hdp37LRmTxyhr/Rp63QkAIAD+L11oJ59tueYbvvDxzrsK1f+pExKVzQozpeW9JAWJgUei/NjN0e0vBYAQeGIF1CPVm0/rAmzPUpJTtLLk0eqf4fmTkdCcb7kyZH8vsC2rySwLUk9s2IrR7S8FgBB44gXUE+Wbjmg77z4iZo2StEr942idEWLVVOri8oZfl9gPNZyRMtrARA0jngB9eCd9Xs0ZeFydW/t0vzsTHVo0cjpSDjDVxraeDTniJbXAiBoHPECwmzJih2avKBI/Ts006LJoyhd0cbVLbTxaM4RLa8FQNAoXkAYzV+6TT9YtFIjerRS/qRMtWrSwOlIOFv6NCnZ9eWxZFdgPNZyRMtrARA0ihcQBtZa/f7dzfrx6+v01f7tNGdihpo1SnU6FmrSM0vKyJVc3SWZwGNGbuRPRg9Hjmh5LQCCZqy1Tmc4J7fbbb1er9MxgBpZa/WLtzbqhQ+26pYhnfTL29OVmsy/aQAgURljiqy17pqe4+R64AL4K62eWLJGBZ7tGjequ576xiVKSuJm1wCAmlG8gPNUVlGpHyxaqTdX79J3r+qjH153kYyhdAEAakfxAs7DyTK/7ltQpPc37dN/f72/cq7o7XQkAEAMoHgBITp6qlzZc5bJW3JIv7h1kO7K4Ff3AQDBoXgBIdh//LTGz/Jo055j+t3dw3Tj4I5ORwIAxBCKFxCkHYdPauzMQu08clIvjnNrdL92TkcCAMQYihcQhK37jmvMzEIdO1Wh+dmZGtGjtdORAAAxiOIFnMO6nUc0Ls8jSSrIGamBnVs4nAgAEKsoXkAdvNsOauKcZWrWMEXzJ2Wqd1pTpyMBAGIYxQuoxXuf7tV9C4rUqUVjzZ+Uqc4tGzsdCQAQ4yheQA3eXL1LD728Qn3bNdO87Ay1bdrQ6UgAgDjADeWAs7y8rFQPFixXepeWKsgZGT+lqzhfWtJDWpgUeCzOdzqRc8IxF8xnfOL7inoW9iNexpgWkl6SlCzphKQ7rbVlZ+2TImlr1R9JetBauybcWYBQvfjBVk37ywZdeVGa/jBmuBo3SHY6UngU50ueHMnvC2z7SgLbktQzy7lcTgjHXDCf8YnvKyKgPo54ZUn6tbX2Okm7JV1fwz6DJRVYa0dX/aF0wVHWWj37t0817S8bdOOgjnpxnDt+SpckrZpa/ZfJGX5fYDzRhGMumM/4xPcVERD2I17W2ulf2EyTtLeG3UZKuskYc5WkNZImW2srvriDMSZHUo4kdevGLVlQfyorrZ768zrNW1qiO91d9bNbByk5Kc5udu0rDW08noVjLpjP+MT3FRFQb+d4GWNGSWplrf2khqeXSbrGWpshKVXS18/ewVqba611W2vdaWlp9RUTCa7cX6kfLl6leUtLlHNFL/3i23FYuiTJVcs/Xmobj2fhmAvmMz7xfUUE1EvxMsa0lvRbSffUsstqa+2uqo+9kvrWRw6gLqfK/bp/wXL9ccUOPfK1fnr8hv4yJg5LlySlT5OSXV8eS3YFxhNNOOaC+YxPfF8RAWEvXsaYBpIWS3rcWltSy27zjTHpxphkSbdIWhXuHEBdjp+u0MTZy/TOhj366c2X6IGr+sRv6ZICJwZn5Equ7pJM4DEjNzFPGA7HXDCf8YnvKyLAWGvD+x805n5JP1N1mXpXUqq19okv7DNQ0kJJRtKfrLV1nrnodrut1+sNa04krkMnyjRhtkdrdx7Vs7cP1reGdnE6EgAgjhhjiqy17pqeq4+T62dImnGOfdYq8JuNQETtOXpKY2YWquSgT38YM1zXDmjvdCQAQALhyvVIGKUHfMrK+0QHj5dpzsQRurR3W6cjAQASDMULCeHT3cc0Nq9QZf5KLbx3pNK7tnQ6EgAgAVG8EPdWlB7ShNnL1DAlSYsmj9JF7Zs5HQkAkKAoXohrH2/er0nzvGrbtKEWZGeqWxvXuT8JAIB6QvFC3Hp73W59t2CFerZpovnZGWrXvJHTkQAACY7ihbj02vLP9cgrqzWwcwvNnThCLV0NnI4EAADFC/FnzkfFeurP63Vp7zbKHedW04YscwBAdOBvJMQNa61+98/N+tXfN+naAe3127uHqlFqstOxAAD4N4oX4oK1VtPe3KCZ/yrWrcM665lvD1ZKcr3dAx4AgPNC8ULM81daPf7aai3yfq4Jl/bQkzcNUFJSHN93EQAQsyheiGmnK/x66KWVemvtbn3v6j76wbUXxffNrgEAMY33YhCzfGUVmjTXq7fW7tYTN16sh6/rF52lqzhfWtJDWpgUeCzOdzoRPFOkghRpoQk8eqY4nQhAguCIF2LSkZPlumfOMq0oPaRnvj1Yd4zo6nSkmhXnS54cye8LbPtKAtuS1DPLuVyJzDNF2jyjetv6q7czpjuTCUDC4IgXYs6+Y6d1V+4nWv35Yf3+O8Oit3RJ0qqp1aXrDL8vMA5nbMkNbRwAwogjXogpnx/yaWyeR7uPnFLe+BG64qI0pyPVzVca2jjqn/WHNg4AYcQRL8SMzXuP6/Y/LNX+46e1YFJG9JcuSXJ1C20c9c/Ucm232sYBIIwoXogJa3cc0R0vLFW5v1Iv54zS8O6tnY4UnPRpUvJZN+ZOdgXG4YzeOaGNA0AYUbwQ9TzFB3V37idqnJqsxfddqgGdmjsdKXg9s6SMXMnVXZIJPGbkcmK9kzKmS33urz7CZZID25xYDyACjLXW6Qzn5Ha7rdfrdToGHPDuxr26b0GROrdqrAXZmerUsrHTkQAAqJMxpsha667pOU6uR9T686qd+sHLK9W/YzPNnZihNk0bOh0JAIALQvFCVFpYWKqpS9ZoRPfWmjnBreaNUp2OBADABaN4Ier84f0t+sVbG3VVvzRNzxquxg34bTMAQHygeCFqWGv1zN8+1Yz3tuimwR316zuGqEEKv/8BAIgfFC9EhcpKqx+/vlb5haW6O6Obnr5loJKTovC+iwAAXACKFxxX7q/Ujxav0usrd+q+K3vrv66P0ptdAwBwgShecNSpcr8eyF+uf2zcq0ev76cpo/s4HQkAgHpD8YJjjp0q16S5Xnm2HdTTtwzUmJHdnY4EAEC9onjBEQdPlGn8LI827Dqq39w5RDcP6ex0JAAA6h3FCxG3+8gpjckr1PaDPuWOG66r+7d3OhIAABFB8UJEbdt/QmPyCnXYV66592RoZK82TkcCACBiKF6ImA27jmpsnkf+ykoV3DtSg7q0cDoSAAARxdUpEXb5+VKPHlJSUuAxP18qKjmkO19YqpQko0WTR1G6QlWcLy3pIS1MCjwW5zudKLYxn6gNawP1jCNeCKv8fCknR/L5AtslJdIDP92vtG951al1Qy3IzlTX1i5nQ8aa4nzJkyP5qybVVxLYlqSeWc7lilXMJ2rD2kAEcMQLYTV1anXpkqTGfXerxU3LVH7IpcX3jaJ0nY9VU6v/IjjD7wuMI3TMJ2rD2kAEULwQVqWl1R83GbhdabcUqWxPc22fO0rtmjVyLlgs85WGNo66MZ+oDWsDEUDxQlh16xZ4bDa8WG1vXK1TpW215+VMdW2f6mywWObqFto46sZ8ojasDUQAxQth9fTTVm1Hb1Lra9brxKcdtPcVtxqnpmjaNKeTxbD0aVLyWW/RJrsC4wgd84nasDYQARQvhE1lpdWWFuvVJPMzaWsXHfjTUHXvkqzcXCmL81LPX88sKSNXcnWXZAKPGbmc7Hu+mE/UhrWBCDDWWqcznJPb7bZer9fpGKhDhb9Sj722Rq8Ufa6JX+mhH984QElJxulYAABEnDGmyFrrruk5LieBC3a6wq/vFazQ39bt0UPX9NX3v9pXxlC6AAA4G8ULF+TE6QpNnl+kf23erydvGqB7LuvpdCQAAKIWxQvn7YivXBPmeLRq+2E9e3u6bhvexelIAABENYoXzsveY6c0Ls+jrftOaHrWcF0/sIPTkQAAiHoUL4Rs+0GfxuQVat+x05o1YYQu69vW6UgAAMQEihdCsnnvMY2Z6ZGvrEILJmVqWLdWTkcCACBmULwQtNWfH9b4WR6lJCdp0X2j1L9Dc6cjAQAQUyheCMonWw9o0lyvWrpStSA7Uz3aNnE6EgAAMYfihXP6x4Y9mpK/XF1bu7QgO1MdWnCzawAAzgfFC3V6feUO/XDRKl3csbnm3pOh1k0aOB0JAICYRfFCreZ/UqInX1+rjB6tNXO8W80apTodCQCAmMZNslGj6e9t1o+XrNXV/dpp7j0ZlC4AdSvOl5b0kBYmBR6L8xM7B1ALjnjhS6y1+sVfN+qF97fq5iGd9Ozt6UpNpp8DqENxvuTJkfy+wLavJLAtST2zEi8HUAf+RsW/+Sut/vuPa/XC+1s1ZmQ3PXfHEEoXgHNbNbW67Jzh9wXGEzEHUAeOeEGSVFZRqYcXrdQbq3dpyujeeuRr/WSMcToWgFjgKw1tPN5zAHXgcAZ0ssyvnPlevbF6lx6/ob8evb4/pQtA8FzdQhuP9xxAHSheCe7oqXKNn+XR+5v26ee3DtLkK3s7HQlArEmfJiW7vjyW7AqMJ2IOoA4UrwR24Php3Z37iZaXHtLzdw3V3Rn8qxDAeeiZJWXkSq7ukkzgMSM38ie0R0sOoA7GWut0hnNyu93W6/U6HSOu7Dx8UmPyCrXz8EnNGDNcV/Vr53QkAADigjGmyFrrruk5Tq5PQMX7T2jMzEIdPVmuefdkKqNna6cjAQCQECheCWb9zqMaN6tQlVYqyBmpgZ1bOB0JAICEQfFKIN5tBzVxzjI1bZii+dmZ6tOuqdORAABIKBSvBPHBpn2aPL9IHVo00vzsDHVp5Tr3JwEAgLCieCWAv6zZpe+/tEJ92jXTvHsylNasodORAABISBSvOLdo2XY99tpqDe3WSrMmjFCLxtzsGgAAp1C84tjMD7fq6Tc36PK+bfXC2OFyNeDbDQCAk/ibOA5Za/Xc3zfp+X9u1tcHddBzdw5Rw5Rkp2MBAJDwKF5xprLS6idvrNecj7fpTndX/ezWQUpO4r6LAABEA4pXHKnwV+rRV1brtRU7NOmynpp648Xc7BoAgChC8YoTp8r9erBghf6+fo9+eO1F+u7VfShdAABEGYpXHDh+ukI587z6eMsB/f9vXqLxl/ZwOhIAAKgBxSvGHfaVafzsZVq744h+fUe6bh3WxelIAACgFhSvGLbn6CmNzSvUtv0+zcgapusu6eB0JAAAUAeKV4wqPeDTmLxC7T9+WnMmjtClfdo6HQkAAJwDxSsGbdpzTGNmFqrMX6mF947UkK4tnY4EAACCQPGKMau2H9b42R41SE7Syzmj1K9DM6cjAQCAIFG8YsjHW/br3rletW7aQPnZI9WtjcvpSAAAIAQUrxjx9/V79MDC5ere2qUFkzLVvnkjpyMBAIAQUbxiwB9XfK4fLV6tgZ2aa87EDLVq0sDpSAAA4DxQvKLcvKXb9OTr6zSqVxu9ON6tpg35lgEAEKv4WzxKWWv1+3c369m3N+naAe3127uHqlFqstOxAADABaB4RSFrrX72lw168cNifWtoZz1z22ClJic5HQsAAFwgileU8Vda/fdra/Syd7vGjequp75xiZKSuNk1AADxgOIVRcoqKvWDl1fqzTW79ODVffTwtRfJGEoXAADxguIVJXxlFbpvwXJ9sGmfnrjxYk26vJfTkQAAQJhRvKLAkZPlyp6zTMtLD+l/vj1Id47o5nQkAABQDyheDtt37LTGz/Los73H9LvvDNPXB3V0OhIAAKgnFC8H7Th8UmNmFmrXkZOaOX6ErrwozelIAACgHlG8HLJl33GNnVmoY6crtCA7U+4erZ2OBAAA6hnFywFrdxzR+FkeGSO9lDNSl3Rq4XQkAAAQARSvCPMUH1T2nGVq1ihFCyZlqldaU6cjAQCACAn75dCNMS2MMW8ZY942xvzRGFPjHZ2NMXnGmKXGmCfCnSFavffpXo2bVai05g31yv2XUroQvOJ8aUkPaWFS4LE43+lEAIDzUB/3ocmS9Gtr7XWSdku6/uwdjDG3Skq21o6S1MsY07ceckSVN1bv1L3zvOqd1lSLJo9Sp5aNnY6EWFGcL3lyJF+JJBt49ORQvgAgBoW9eFlrp1tr/161mSZpbw27jZa0qOrjtyVdFu4c0aTAU6oHC1ZoSNeWKsgZqbZNGzodCbFk1VTJ7/vymN8XGAcAxJR6u/OyMWaUpFbW2k9qeLqJpB1VHx+U1L6Gz88xxniNMd59+/bVV8x698L7W/T4a2t0Rd80zbsnU80bpTodCbHGVxraOAAgatVL8TLGtJb0W0n31LLLcUln3mtrWlMOa22utdZtrXWnpcXe9a2stfrl3zbq529t1I2DO+rFcW41bpDsdCzEIlctdzKobRwAELXq4+T6BpIWS3rcWltSy25Fqn57MV3StnDncFJlpdWTr6/T79/dorszuur5u4aqQUq9HVxEvEufJiW7vjyW7AqMAwBiSn1cTiJb0jBJU40xUyW9KynVWvvF315cIulDY0wnSTdIGlkPORxR7q/UI4tXacnKnZp8RS89dkN/GWOcjoVY1jMr8LhqauDtRVe3QOk6Mw4AiBnGWuvMFzamlaRrJX1grd1d175ut9t6vd7IBLsAp8r9+u7C5Xpnw1498rV+mjK6N6ULAIAEY4wpsta6a3rOsQuoWmsPqfo3G2Pe8dMVmjR3mQqLD+qntwzU2JHdnY4EAACiDFeuD4ODJ8o0YbZH63Ye1W/uHKKbh3R2OhIAAIhCFK8LtPvIKY3NK1TJQZ9eGDNc1wz4jytjAAAASKJ4XZCSAyeUNbNQh06Uae7EDI3q3cbpSAAAIIpRvM7Txt1HNTbPowp/pQpyRmpwl5ZORwIAAFGO4nUeVpQe0oTZy9QoNUmLJo9S3/bNnI4EAABiAMUrRB9t3q9753mV1qyhFmRnqmtr17k/CQAAQBSvkPx17W59r2CFerZtovnZGWrXvJHTkQAAQAyheAXp1aLP9eirqzWocwvNmThCLV0NnI4EAABiDMUrCHM+KtZTf16vr/Rpo9yxbjVpyLQBAIDQ0SDqYK3V8//YrOfe2aTrBrTX83cPVaPUZKdjAQCAGEXxqkVlpdXTb27QrI+Kdeuwznrm24OVkpzkdCwAABDDKF41qPBX6vHX1mhx0eeacGkPPXnTACUlcbNrAABwYSheZzld4df3C1bqr+t26/tf7auHrukrYyhdAADgwlG8vsBXVqHJ84v04Wf79eRNA3TPZT2djgQAAOIIxavKEV+5Js7xaOX2w/rlbYN1u7ur05EAAECcoXhJ2nvslMblebR13wlNzxqm6wd2dDoSAACIQxQvSUdPluvYqQrlTXDr8r5pTscBAABxiuIlqU+7Znr3R6PVIIXLRQAAgPpD06hC6QIAAPWNtgEAABAhFC8AAIAIoXgBAABECMULAAAgQiheAAAAEULxAgAAiBCKFwAAQIRQvAAAACKE4gUAABAhFC8AAIAIoXgBAABECMULAAAgQiheAAAAEULxAgAAiBCKFwAAQIRQvAAAACKE4gUAABAhFC8AAIAIoXgBAABECMULAAAgQiheAAAAEULxAgAAiBBjrXU6wzkZY/ZJKonAl2oraX8Evk6iYD7DjzkNL+Yz/JjT8GI+wy8Sc9rdWptW0xMxUbwixRjjtda6nc4RL5jP8GNOw4v5DD/mNLyYz/Bzek55qxEAACBCKF4AAAARQvH6slynA8QZ5jP8mNPwYj7DjzkNL+Yz/BydU87xAgAAiBCOeAEAAEQIxQthYYxpb4xZUctzKcaYUmPMe1V/BkU6HxJXMOuPNYpoYIyZboz5Ri3PsUbjREIWr7pKQtXzecaYpcaYJyKZK8Y9K6kAZrKuAAAFCklEQVRxLc8NllRgrR1d9WdNBHPFlGB/uLJGQxLM+mONnoe6ikLV86zTIBljLpfUwVr751p2YY2GwBhz/xd+jq40xrxQy34RX6MJWbxUR0kwxtwqKdlaO0pSL2NM34gmi0HGmKslnZC0u5ZdRkq6yRjjqVrkKZFLF3PO+cOVNRqyYNYfazRE5yoKrNPgGWNSJb0oaZsx5uZadmONhsBaO+PMz1FJHyowv1/i1BpNuOIVREkYLWlR1cdvS7osArFiljGmgaQfS3qsjt2WSbrGWpshKVXS1yORLUYF88N1tFijoQhm/bFGQxBkURgt1mmwxklaL+kZSRnGmAdr2Ic1eh6MMZ0ltbfWemt4erQcWKMJVbyCLAlNJO2o+vigpPb1nSvGPSZpurX2cB37rLbW7qr62CuJf/nWLpgfrqzR0ASz/lijoQmmKLBOgzdUUq61drekBZKuqmEf1uj5eUDSjFqec2SNJlTxUnAl4biq34ZsqsSbo1BdI+kBY8x7koYYY2bWsM98Y0y6MSZZ0i2SVkUyYIwJ5ocrazQ0waw/1mhogikKrNPgbZbUq+pjt2q+NzFrNETGmCQF1uZ7teziyBpNtP8RgikJRao+3JguaVtkosUma+0VX3gffaWkXxtjnj5rt59Iml/1/FJr7TsRjhlLgvnhyhoNzZfWn6SdrNELFkxRYJ0GL0/SVcaYDyRNkfQKazQsLpdUaGu/YKkjazRhL6BaVb6mSPqOtfaJL4w3V+BEvH9IukHSSGvtEUdCIuEYYwZKWijJSPqTpHyxRhFljDHNJM1S4K2ZVEk/knQD6xTRxBjzM0lea+1rxpgBipKfpQlbvOpijGkl6VpJH1QdSgeiCmsUsYB1imjnxBqleAEAAERIop3jBQAA4BiKFwAAQIRQvADErapfognbfkH+t3oYY0Z/YXuCMWZCuP77AGIbxQsAwquHAlfEBoD/wL2eADjOGNNY0mJJzSUdkHS7pAaS5klqJ2mNtfYBY8xTkjIluSTtk3SXJKvA9Y26S9ov6TZrbfkFZDGSciVdVPU17pQ0VoHr/KRL6iDpDknrFLh4aG8Frn5dUvVnoqSWVUe9bq/6z6YbY/555nOttWvPNx+A2MYRLwDRYICkSmvtFZJmK3AV6RxJa6vGOhpjBlft+6G19kpJeyTdLKmNpDclXSnpqKRhF5jlZkmpVV+jVNKNVeMjJH1N0i8kfVNSK0ntrLUjJfW01j5srf1fSQ9JmlN1YeF9tXwugARF8QIQDZZLWmuMeVuBguKT1E/St6rOv+olqXPVvkVVj6sVeFuvXNJNChwx66XqW4Ccr36SRlV93StUff+2gqojaaUKHI3zSWpojClU4EK3dTn7cwEkKIoXgGiQLukja+11ChxJulzSp5J+U3U7qicUKC2SlFH1OFSBW9fcKmlt1eMOXbhPJb1U9XUfUuBm0JJ04qz9MiT90Vqbaa391RfGTyrwVuiZty1r+lwACYriBSAabJP0PWPMxwqcB+WV9KKkG6ruX3efpO1V+46oOhrVUtIbkj5S4Dysf0lqreojY+frT5I6GWPel/S0ar4PoSRtlPSwMeZdY8yrxpjLq8ZXSOpnjPmwKhcA/BtXrgcQM6pOrn/PWvuew1FkjLlR0qOSyhQ4yrXQWvuSs6kARDuKFwAAQITwViMAAECEULwAAAAihOIFAAAQIRQvAACACKF4AQAARAjFCwAAIEL+D7Z9x5dmYWq0AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 720x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "clf = Perceptron(fit_intercept=True, \n",
    "                 max_iter=1000,\n",
    "                 tol=None,\n",
    "                 shuffle=True)\n",
    "clf.fit(X, y)\n",
    "\n",
    "# 画布大小\n",
    "plt.figure(figsize=(10,10))\n",
    "\n",
    "# 中文标题\n",
    "plt.rcParams['font.sans-serif']=['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False\n",
    "plt.title('鸢尾花线性数据示例')\n",
    "\n",
    "plt.scatter(data[:50, 0], data[:50, 1], c='b', label='Iris-setosa',)\n",
    "plt.scatter(data[50:100, 0], data[50:100, 1], c='orange', label='Iris-versicolor')\n",
    "\n",
    "# 画感知机的线\n",
    "x_ponits = np.arange(4, 8)\n",
    "y_ = -(clf.coef_[0][0]*x_ponits + clf.intercept_)/clf.coef_[0][1]\n",
    "plt.plot(x_ponits, y_)\n",
    "\n",
    "# 其他部分\n",
    "plt.legend()  # 显示图例\n",
    "plt.grid(False)  # 不显示网格\n",
    "plt.xlabel('sepal length')\n",
    "plt.ylabel('sepal width')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "现在可以看到，所有的两种鸢尾花都被正确分类了。\n",
    "\n",
    "----\n",
    "参考代码：https://github.com/wzyonggege/statistical-learning-method\n",
    "\n",
    "本文代码更新地址：https://github.com/fengdu78/lihang-code\n",
    "\n",
    "中文注释制作：机器学习初学者公众号：ID:ai-start-com\n",
    "\n",
    "配置环境：python 3.5+\n",
    "\n",
    "代码全部测试通过。\n",
    "![gongzhong](../gongzhong.jpg)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
